Throubleshooting MySql Case Sensitive Criteria Hibernate

 

Olá Pessoal,

Mais um thoubletshooting, e dessa vez é com o Mysql. É aquela velha frase “vivendo e aprendendo”. No dia a dia trabalho com outros bancos de dados, mas nos meus projetos house-made gosto do mysql.

Um dia desses estava desenvolvendo e um dos requisitos era considerar o case-sensitive. Dai vou lá feliz da vida usando o Criteria do Hibernate com o MySql:

criteria.add(Restrictions.eq(“email”, email));

criteria.add(Restrictions.eq(“password”, password));

E o que acontece?

Simplesmente se tiver:

camilo@camilolopes.com com o password: 123cam

e

camilo@camilolopes.com com o password: 123CAM

Teremos dois registros no retorno.

Daí fui ver na documentação o motivo e achei isso:

http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html

Solução

Como podemos ver na documentação acima, o Mysql trata Varchar como case-insensitive. Daí ao criar a tabela devemos setar a flag Binary. Caso  a tabela já exista, basta dar um alter table

ALTER TABLE `user` MODIFY COLUMN `EMAIL` VARCHAR(255) BINARY CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;

Pronto. E resolvido.

Vou ficando por aqui.

See ya!!!

Curso Online Hibernate na Prática – IMasters Pro

Olá Pessoal,

O post de hoje será diferente. Na verdade vou falar rapidinho sobre o curso “Hibernate na Prática” que  foi lançado essa semana no IMastersPro. A seguir falo os pontos que considerei chave e que geram possíveis dúvidas.

Lets GO…

Objetivo

Ensinar de forma prática como desenvolver aplicações Java usando o framework Hibernate.

Publico Alvo

Programadores iniciantes em Java que deseja aprender um dos frameworks mais usado no mercado para persistência de dados com Java, mas que não sabe por onde começar. Quais requisitos preciso?Veja:

– já saber Java e fazer conexão com bando de dados JDBC;

– é importante saber o que são libs;

– saber o básico de DB: criar tabelas, usuário, permissões etc;

O que vou ver no curso ?  

Nada demais. Além de aprender como usar o básico do Hibernate em suas aplicações Java. O curso foi pensado em quem está querendo dar os primeiros passos, mas se sente perdido e não sabe por onde começar de forma organizada, será visto então:

– o que é Hibernate?

– como usar Hibernate no Java

– HQL

– Criteria API

– Relacionamento OneToMany/ManyToOne;

Etc.

E o que não vou ver?

Não espere ver o mundo JEE no curso, até por que para aprender Hibernate não é requisito saber a plataforma JEE.

E como é a parte prática do curso?

Dentro de um ciclo de assuntos vistos temos atividades e projetos para serem desenvolvidos visando exercitar o que já vimos.

Vou ser um expert em Hibernate após o curso?

Não. E está longe de ser fazendo apenas o curso. Esse não é o objetivo 🙂

 Bom era isso que queria apresentar, mais detalhes vejam na página do curso: http://pro.imasters.com.br/online/cursos/hibernate-na-pratica

abraços, see ya!!

 

Conectar JasperReport com DB via Hibernate

Olá Pessoal,

O objetivo deste post é mostrar como conectar com jasperReport com DB usando Hibernate, é comum ver a conexão via JDBC tradicional, mas nem sempre é isso que queremos.Então veremos agora com Hibernate.

Lets go…

Contexto

Talvez você já tenha passado por o problema abaixo:

Class.forName(“com.mysql.jdbc.Driver”);

String db = “jdbc:mysql://localhost:3306/relatorios”;

conn = DriverManager.getConnection(db,”camilo”,”lopes”);

E não será nada legal ter que colocar esses dados dentro do seu code Java, ou criar um arquivo separado só para isso, e quando o user/password/url, sofrerem alterações teremos que mudar em mais de um lugar? Duplicated Context is not good! :). Até um dia desses nunca precisei eu não tinha preocupação com a conexão uma vez que já passava para o JasperPrint uma lista(list) dos dados recuperados via HQL, conforme os posts a seguir:

JasperReport com JEE

JasperReport + Hibernate

Mas, nem sempre HQL,Criteria etc, atende a uma regra de negócio da melhor forma, no meu caso, já tinhamos o .SQL com as devidas queries e lá que estavam as regras com base no DB que estamos trabalhando, que vai além de um simples retrieve. Daí, será q eu deveria usar HQL/Criteria somente porque estou usando Hibernate? Neste caso, a resposta não. Tive que analisar o impacto, o custo disso e onde as mudanças aconteceriam, e após uma investigação baseado em testes, usar o .SQL será a melhor solução pelo seguintes pontos:

  • toda mudança de regra de negócio referente à DataWarehouse acontece de fato no banco, nos .SQL etc. Então não tem porque eu querer “repetir” as regras do .SQL dentro do código Java;
  • evitou a duplicação de código, porque se a regra vem da DW, o código Java só ia executar ela, então se .SQL muda, terei que mudar também o HQL, seria maior trabalho;
  • Ireport com .SQL eles tem um bom relacionamento;
  • Minha app Java fica mais especifica, com o objetivo apenas de gerar o report;

Desenvolvendo

Levando em conta que você já tem seu report pronto, vou mostrar apenas como configurar sua app para conectar do DB via Hibernate.

Step 1

Na class DAO

Adicione o método a seguir:

publicstatic Connection getConnection() throws HibernateException, SQLException{

returnnew AnnotationConfiguration().configure().buildSettings().getConnectionProvider()
.getConnection();

}

Agora na sua classe que gera o Report adicione:

Não esqueça de importar o arquivo .jrxml para o seu projeto no eclipse.

JasperReport pathRxml = JasperCompileManager.compileReport(“layout/reportcamilo.jrxml”);

JasperPrint printReport = JasperFillManager.fillReport(pathRxml, null, DAO.getConnection());

JasperExportManager.exportReportToPdfFile(printReport, “reportexcamilo.pdf”);

 

Pronto, era apenas isso, passar o objeto Connection vindo do Hibernate para o método fillReport(), se você viu os posts mais antigos, a diferença é que não tem mais a List, sendo passada no terceiro parametro.

Feito, isso, salve e rode Java Application.

Resultado:


Vou ficando por aqui, e espero que tenham gostado do post.

See ya!

Hibernate Schema Diferente via Java Project

olá Pessoal,

Este post é levemente diferente do que vimos no Mapeando schemas diferentes com o Hibernate. Lá tivemos que criar um bean para representar à tabela, neste aqui vamos usar um mapeamento para tabela já existente, assim evitamos de ter dois beans para uma mesma tabela.

Lets go…

Contexto

No post Mapeando schemas diferentes com o Hibernate assumimos que não existia nenhuma projeto Java que usasse o schema ereaders. Mas, no contexto de hoje vamos supor que tenha um outro projeto que use e já tenha os devidos mapeamentos para a tabela ereaders.usuario e não queremos ter que criar um novo bean em nosso projeto só para ler esse schema, pensamos em aproveitar o mapeamento já feito e usá-lo. Isso nos ajuda até em não ter que ficar atualizando cada bean, caso algum atributo da tabela venha sofrer alteração. Então temos os seguintes projetos Java:

O projeto sem enumeração é o que tem o mapeamento usando annotations para tabela que está em ereaders. Como usar esse bean em outro projeto java?

Muito simples, basta adicionarmos ao projeto HibernateSchema2 uma dependencia com o projeto HibernateSchema. Assim, podemos acessar as classes disponiveis naquele projeto. Para fazer isso, clique com o botão direito do projeto >> build path >> configure build path e adicione o projeto HibernateSchema, conforme a imagem a seguir:

No arquibo hibernate.cfg.xml informamos a classe nova que o projeto deve reconhecer via Hibernate:

< mapping class=“br.com.camilolopes.bean.Usuarios”/ >

Testando

Faremos algo semelhante ao que vimos no outro post, vamos ler dados da tabela e imprimir o valor em seguida, porém vamos usar Criteria API:

publicclass UserDAO extends DAO {

publicList getListUsers(){

begin();

Criteria criteria = getSession().createCriteria(Usuarios.class);

return criteria.list();

}

}

Na classe main, adicionamos o codigo:

publicstaticvoid main(String[] args) {

UserDAO userDAO = new UserDAO();

List<Usuarios> listUsers = userDAO.getListUsers();

for (Usuarios usuarios : listUsers) {

System.out.println(usuarios.getEmail()); } }

O resultado:

Nada de novo, o mesmo resultado que tivemos no outro post. Mas, qual a diferença? Veremos isso com base no que pode ser “problema” em alguns projetos.

Problema

  • um dos problemas é ter dependência com outro projeto, ou seja, se o outro não buildar/compilar o seu ficará preso. E isso em alguns cenários pode ser ruim. Depende da relação entre os projetos.

Vantagem

  • você não precisa ter mais dois beans para mesma tabela, então tudo é focado apenas no bean que já está no outro projeto, caso esta sofra alterações não preciso mudar no projeto HibernateSchema2. E evita essas duplicações de beans.

Qual usar?

Como falei, não há segredo, e sim necessidade, o que seu projeto importa mais? O que for mais importante é o que vai precisar.

Vou ficando por aqui espero que tenham gostado do post.

Abracos, see ya! 

Mapeando Schemas diferentes Hibernate

olá Pessoal,

O post de hj veremos como ler uma tabela que está em um schema diferente do default do seu projeto usando o Hibernate. Será um post curto e bem prático.
Lets go…

Contexto

A situação aqui é muito simples. Precisamos ler uma tabela que está em outro schema do banco de dados via Hibernate. O que fazer?

Primeiro
Terá que ter o modelo da tabela e criar um bean no seu projeto Java e fazer os devidos mapeamento com base no modelo algo como:

@Entity
@Table(name=”Usuario”, schema=”ereaders”)
public class Usuarios {
@Id
@GeneratedValue
private int id;
@Column
private String nome;
@Column
private String email;
//getters/setters omitidos

Observe onde temos o pulo do gato, no atributo schema da anotação @Table onde informo qual schema usar. Por default é usado o que foi definido no arquivo hibernate.cfg.xml. Por falar nele precisamos atualizar com o novo bean ao <mapping/> :class=”br.com.camilolopes.bean.Usuarios”

note: assuma que seu hibernate.cfg.xml está apontando para um BD diferente. Alguma coisa como:
<property name=”hibernate.connection.url”>jdbc:mysql://localhost/auge</property>

Testando
Podemos checkar se de fato o conteúdo da tabela Usuario do schema ereaders, é o que está sendo lido, para isso, temos o seguinte dado na tabela Usuario:

 

Aqui nos temos os Bds:

DAO
Vou assumir que você já tem seu DAO implementado e inicializando as sessões corretamente, caso tenha dúvida verifique os posts sobre o assunto na categoria de Hibernate do blog. Criei uma classe que vai usar HQL para fazer um select na tabela e em seguida imprimir:

public class UsuariosDAO extends DAO {   
    public List getListUsuarios(){
        begin();
        Session session = getSession();
        String hql = “select us.email from Usuarios us”;
        Query query = session.createQuery(hql);
        List list = query.list();
            return list;
    }
}

Na classe main,vamos colocar isso só para ver o resultado:
public static void main(String[] args) {
        UsuariosDAO usuariosDAO = new UsuariosDAO();
                List<String> listUsuarios = usuariosDAO.getListUsuarios();
        for (String usuarios : listUsuarios) {
            System.out.println(usuarios);
        }
    }

Resultado

 

Enfim, temos dados de uma tabela em outro schema. A linha acima de camilo@ é que habilitei o sql_show no arquivo de configuração do hibernate.cfg.xml.

Problema
Como tudo não são flores, um problema aqui é que você não pode esquecer que o usuario informado no hibernate.cfg.xml deve ter permissão ao menos de leitura das tabelas no outro esquema. Do contrário verá exceções na tela com a mensagem permission denied. Se o usuário for diferente terá que criar uma session com o user que tem permissão.

Vou ficando por aqui, espero que tenham gostado do post. Muito simples não é?
Abraços, see ya!!