Usando @SecondaryTable Hibernate

Olá Pessoal,

O post de hoje vou mostrar como mapear duas tabelas em um bean do Hibernate. O motivo é que você não quer criar um bean para cada tabela, e precisa apenas ler algumas colunas de uma outra. E quer tudo no mesmo bean.

Lets go…

Contexto
Vamos supor que você tem o cenário a seguir :

E você precisa ler informações tanto da tabela infraestrutura e logicalserserver e ter tudo em um bean.

Desenvolvimento

Vou fazer um DAO bem simples somente para focarmos mais no proposito do post. Estou considerando que você já conhece o Hibernate e portanto toda aquela parte de config e  e .jars do framework não serão apresentados, caso tenha dúvida como fazer veja outros posts na categoria Hibernate do blog.

A seguir temos o nosso projeto:

 

DAO
A seguir temos nosso DAO:
public class DAO {
private static final ThreadLocal threadLocal = new ThreadLocal();
private static final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

public static Session getSession(){
Session session = (Session) threadLocal.get();
if (session==null) {
session = sessionFactory.openSession();
}
return session ;
}
public void begin(){
getSession().getTransaction().begin();
}
public void commit(){
getSession().getTransaction().commit();
}
public void rollback(){
getSession().getTransaction().rollback();
}
}

O bean
Agora temos o nosso bean, onde mapeamos com as duas tabelas:

@Entity
@Table(name=”infraestrutura”)
@SecondaryTable(name=”logicalserver”)
public class InfraServer {
@Id
@Column(name=”infra_id”)
private int infraId;
@Column(name=”name_infra”)
private String nameInfra;
@Column(name=”nameServer”,table=”logicalserver”)
private String nameServer;
public int getInfraId() {
return infraId;
}
public void setInfraId(int infraId) {
this.infraId = infraId;
}
public String getNameInfra() {
return nameInfra;
}
public void setNameInfra(String nameInfra) {
this.nameInfra = nameInfra;
}
public String getNameServer() {
return nameServer;
}
public void setNameServer(String nameServer) {
this.nameServer = nameServer;
}
}

@SecondaryTable: Essa é a anotação que possibilita mapearmos  uma segunda tabela para o mesmo bean. Nada de especial nela, apenas informamos o nome da tabela que desejamos:

@SecondaryTable(name=”logicalserver”)

Agora precisamos informar qual coluna pertence a segunda tabela. Quando não informado o Hibernate vai considerar sempre o mapeamento que temos para @Table.

@Column(name=”nameServer”,table=”logicalserver”)
private String nameServer;

MainDAO
Crie uma classe com o método main que vai ler os dados da tabela e imprimir. Nada de especial que um simples HQL:
public class MainDAO  extends DAO{
public static void main(String[] args) {
List<InfraServer> retrieve = retrieve();

for (InfraServer infraServer : retrieve) {
System.out.println(infraServer.getNameInfra());
System.out.println(infraServer.getNameServer());
}    }

public static List<InfraServer> retrieve(){
Query query = getSession().createQuery(“from InfraServer”);
return query.list();
}
Ao rodar obtemos o seguinte resultado:

Respectivamente temos a tabela: logicalserver, infraestrutura e o console do Eclipse.

É isso ai pessoal, bem simples fazer um bean mapear duas tabelas. No próximo post veremos como fazer isso para mais de uma tabela a partir do mesmo bean.
Abracos, see ya!

Lançamento Oficial do Livro JEE com Frameworks

Comprar

ae Pessoal,

Hoje é mais um dia feliz na minha vida, e primeiramente quero agradecer à todos vocês, pela força, atenção, feedbacks que venho recebendo nesses 3 anos de blog e sem eles, acho que não estaria aqui hj fazendo este post e publicando mais este projeto. Pois, meu segundo filhão nasceu, huhuhu \o/. Lindo igual ao pai, por consequencia do destino hehe. Uma das novidades é que além do formato impresso, temos a versão e-book. A seguir fiz um overview,há um post detalhado de  pré-lançamento aqui.

Lets go…

Note: Infelizmente, tivemos um problema na linha de produção da gráfica e atrasou a publicação que estava prevista para meados de julho/2011.

Agradecimento

Antes de tudo, preciso agradecer ao melhor amigo o Edson Gonçalves. Amigo este de longas datas, o qual eu tenho grande admiração e respeito. É um dos profissionais mais completos de TI que já pude conhecer, o cara tem um conhecimento cross que é uma coisa de louco(não se limita só a parte técnica). Fora amizade que temos, onde às vezes pego o caminho errado, o verdadeiro amigo aparece e ti fala:”Falei que poderia contar comigo, o caminho  é aquele vai em frente”. Esse é o Edson um amigo de verdade.

Outra pessoa que não posso deixar de agradecer é o Daniel de Oliveria (leader-DFJUG) de uma das maiores e respeitável comunidade de Java que temos no Brasil, estou falando do DFJUG. E não poderia deixar de dar minha contribuição (para quem não sabe eu vim da comunidade Java, foi onde tudo começou e hoje retribuir o que recebi é o minimo que posso fazer), adicionado a marca  na capa do livro. Obrigado Daniel pelo seu apoio e da comunidade :).

Overview

O livro tem como objetivo de ajudar aqueles profissionais que desejam aprender Java com Frameworks. É comum ao sairmos do “ABC do JEE” (normalmente é JSP/Servlet) sem saber qual framework estudar (Hibernate, JSF, Spring, “Struts”, VRaptor etc). Porém, há um problema que todo iniciante encontra: como aprender os frameworks e saber integrá-los em uma aplicação real? É isso que vamos ver no livro, aprender a usar os frameworks de forma prática e ver um pouco da teoria(se não gosta de teoria não se preocupe, pois veremos o suficiente para poder programar de maneira confortável). Os exemplos são variados, desde Java Application até JEE, a evolução de aprendizado no livro está no formato “baby-step” ajudando assim o leitor leigo no assunto. Uma novidade que alguns vão gostar e outros não, são os exercícios chamados de “Trabalho do dia” que tem como objetivo fazer o leitor desenvolver uma solução, porém há momentos que o leitor vai precisar fazer uma pesquisa na documentação da API, Google ou consultar outros capítulos.Porém, não avisamos isso no livro, então  o leitor terá que ter essa percepção. O motivo de ter adotado isso aos exercícios, transmitir um pouco do que vai encontrar no dia-dia como desenvolvedor in company, pois nem sempre teremos um colega do lado para dar o help que precisamos.

Público-Alvo

Programadores Java que tem como objetivo aprender de forma pratica o uso dos frameworks JEE mais requisitado no mercado.

Qual o diferencial?

Meus livros são diferentes, primeiramente pela escrita. Eu gosto muito da informalidade, de ser direto e tentar transmitir a informação da melhor maneira possível, como se eu tivesse ao lado do leitor. Nesse livro há vários diferenciais, um deles é o nosso laboratório on-line onde o leitor poderá fazer download do source, assistir uns vídeos de como colocar aplicação em um servidor de produção JEE(apoio da www.integrator.com.br), exercícios práticos etc.

Quando ler?

Assim, que terminar seus estudos, com Servlet & JSP, vc pode ler, do contrário, não faça o investimento agora e aguarde mais um pouquinho( coloque o livro na prateleira ou remova do seu carrinho de compras : ) ).

Requisitos

É preciso já ter uma certa experiência com Java, Banco de dados, saber como as aplicações JEE funcionam etc. Como o livro é focado em ensinar a usar de forma pratica os frameworks, não podemos perder tempo com toda teoria de JEE, então vamos direto ao assunto.Particularmente não gosto de livros grandes, eles ficam mais caros e o que eu quero é um preço acessível para todos, enfim até os que recebem mesada podem comprar (pelo menos a minha na época que tinha, os livros eram caros demais rs).

Desconto

Se quiser comprar o exemplar com 30% de desconto no site da Editora, basta usar o código a seguir durante a compra: V00014 e se cadastrar como associado.

Concorra Sorteio será 21/08/2011

Faça um RT da mensagem abaixo e sua inscrição, assim terá a chance de receber um exemplar na sua casa autografado(se preferir). Para sorteio usaremos o random.org e o número sorteado será o ganhador e a verificação do RT  Lembrando que para aqueles que fizeram mais de um cadastro com o mesmo e-mail, não estará concorrendo ao exemplar.

Lançamento do Livro Guia JEE c/ frameworks @RT: @camilolope #JEE #frameworks.Confira:

Lançamento Oficial do Livro JEE com Frameworks

Após, o resultado entrarei em contato pelo e-mail cadastrado e o ganhador tem até 48 hrs para responder, após o envio  do e-mail.Do contrário um novo sorteio será realizado, e o ganhador anterior acabou de perder a chance de receber o livro. : )

Fazer inscrição

Você pode deixar de ganhar se não fizer isso:

  • cadastrar e não fazer o RT;

  • fazer o RT e não se cadastrar;

A qtde de RT fica por sua conta, se quiser fazer mais de RT, ficarei feliz :).

Versão do Livro

  • Paper – R$ 47,20
  • E-book  – R$ 35,40

Eu quero comprar o meu

Onde comprar?

  • Site da Editora
  • Saraiva
  • Cultura
  • Fnac
  • Americanas.com
  • Submarino
  • e outras que eu não lembro rs

Download

Conseguir com a editora amostra de algumas páginas do livro, confiram aqui

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

Abracos see ya!!

Data com Hibernate

Olá pessoal,

o post de hoje é com datas. Quem aqui nunca sofreu quando precisou manipular datas? Sempre quando vou trabalhar com datas busco gastar um bom tempo na investigação com base nos requisitos para ver se encontro a melhor forma possível de implementar, buscando sempre atingir uma manutenção fácil e code clear. Veremos o suporte que temos via annotations que pode nos ajudar bastante.

Lets go…

Contexto

Um dia desses precisei salvar datas e que em seguida uma StoredProcedure(SP) ia precisar ler. Até ainda nenhum problema aparentemente. Mas, ele surgiu quando tive chamar as SP via Hibernate e passar a data que estava em uma tabela no formato salvo: 2011-07-04 00:20:00. O Hibernate ao ver os dois-pontos vai achar o que vem depois é uma variável e vai buscar ler o valor, como não dar exceção. Claro poderiamos resolver esse problema de fazer o Hibernate ignorar os dois-pontos usando aspas simples, mas não ficar nada friendly essa parte do código. Então como resolver?

Bem, para resolver eu preciso à hora da data, posso fazer isso via Java ou no Banco. Mas, se eu não tiver acesso o banco e somente as informações de onde salvar e os dados que preciso, como resolver isso?

Se ter Hora/Minute não for importante, então vamos ignorar ela com o annotation @Temporal e informar que somente iremos persistir à data.

Desenvolvimento

Classe Pedido

//… omitido

import javax.persistence.Temporal;

import javax.persistence.TemporalType;

@Entity

@Table(name=“CLI_PEDIDO”)

public class Pedido {

@Id

@GeneratedValue

@Column(name=“ID_PEDIDO”)

private int idPedido;

@Column(name=“DATE_PEDIDO”)

@Temporal(TemporalType.DATE)

private Date datePedido;

 

Classe Main

Pedido pedido = new Pedido();

pedido.setListProdutos(listProduto);

pedido.setCliente(cliente);

pedido.setCondicaoPgto(“Dinheiro 30/60/90 dias/à vista”);

pedido.setDatePedido(new Date());

Resultado

A seguir temos o resultado:


 

 

Note

No Java quando trabalhamos com data, o retorno do objeto é uma TimeStamp (data +hora) e poderiamos manipular para obter apenas a data ou poderiamos usar a classe java.sql.Date que permite salvar apenas a Data. Particulamente, colocar uma anotação, achei mais simples e flexivel, pois hoje não preciso do horário, mas se amanha precisar, a única mudança que faremos é mudar anotação e o código é mantido, uma vez que já temos à nível de codificação data com hora.

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

Abracos, see ya!!guys! 🙂

Lendo XML & Populando no BD via Hibernate

olá Pessoal,

O post de hoje é como popular um banco de dados tendo os dados em um arquivo XML. Se ainda não passou por esse requisito no seu trabalho, não se preocupe que o momento vai chegar. Há várias formas de fazer a leitura do arquivo XML e popular o banco, para o post, escolhi o Xstream e o Hibernate, que já uso o Hibernate por default e o Xstream é de fato uma boa API. Há também a SAPX, que não cheguei a testar.

Lets go…

Requisitos

  • Java 5/superior
  • Hibernate 3.x/Superior
  • Eclipse IDE
  • Xstream : faça o download da API
  • MySql 5

Iniciando

Para inicio você precisa criar um Java Project no seu Eclipse, e ter as bibliotecas do Hibernate adicionadas ao projeto. Não esqueça de adicionar os .JARS do MySql e do XStream (apenas xstream-1.3.1.jar). Abaixo temos o nosso banco vazio, aguardando os dados do XML.

Vamos usar annotations para o mapeamento do nosso bean com o Hibernate, se tiver dúvidas de como fazer isso, terá que ver alguns posts meus mais antigos de Hibernate com annotations.

A seguir temos a imagem de como vai ficar nosso projeto. Você já pode ir adicionando as classes e as bibliotecas, ao decorrer do post, vamos apresentando os códigos relevantes.

Antes de mais nada faça o download do nosso arquivo XML que possui os dados dos usuarios que vamos popular, e adicione ele à raiz do projeto. Para fazer isso basta clicar com o botão direito no projeto, escolher importar ==> File System e buscar pelo arquivo XML no seu computador.

Baixar o usuarios.xml

note: no arquivo usuarios.xml não temos o campo id para representar a coluna no banco, uma vez que este será gerado de forma automatica. Então ao abrir o arquivo sentirá falta dele.

Resolvi colocar poucos dados no XML, mas se funcionar com 2-3, deve está ok com 10,20 etc. (teoricamente sim).


Na imagem acima temos o projeto atualizado com o arquivo xml.

Pronto. Acho que até aqui estamos ok. Na próxima etapa serão os codes das classes que vamos precisar para trabalhar de verdade.

Desenvolvimento

Primeiramente você deve criar o Bean, ou seja, a classe Usuario e fazer as devidas anotações, conforme o code abaixo. Removi os getters/setters, para poupar espaço:

@Entity

@Table

public class Usuario {

@Id

@GeneratedValue

private int id;

@Column

private String nome;

@Column

private String email;

@Column

private String senha;

@Column

private String tipo;

 

Agora, configure o seu arquivo hibernate-cfg.xml com os dados de conexão do seu banco. Não esqueça de definir o mapping para a classe bean, veja como ficou o meu:


Agora vamos criar os metodos para persistência em nossa classe HibernateDAO, ficando assim:

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateDAO {

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

private static final SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

public Session getSession() {

Session session = threadLocal.get();

if (session == null) {

session = sessionFactory.openSession();

}

return session;

}

public void begin() {

getSession().beginTransaction();

}

public void commit() {

getSession().getTransaction().commit();

}

public void rollBack() {

getSession().getTransaction().rollback();

}

public void close() {

getSession().close();

}}

Agora vamos atualizar a classe UsuarioDAO que é a classe que solicita que a persistência aconteça.

public class UsuarioDAO extends HibernateDAO{

public void create(List<Usuario> listUser){

for (Usuario usuario : listUser) {

begin();

getSession().save(usuario);

try{

commit();

}catch (HibernateException e) {

e.printStackTrace();

rollBack();

}

}}}

Para quem já trabalha com Hibernate nada de especial até aqui. Lembrando que o objetivo do post não é explicar Hibernate e sim, mostrar como popular dados de um XML no banco.Então não vou entrar em detalhe sobre o code acima, qualquer dúvida basta consultar outros posts meus que explico em detalhe o Hibernate.

Vamos atualizar a classe LerDadosXML, que como nome já diz, ela será responsável

public class LerDadosXML {

private List<Usuario> listUsuario;

public List<Usuario> lerXml(Reader fonte){

XStream stream = new XStream(new DomDriver());

stream.alias(“Usuario”, Usuario.class);

List<Usuario> fromXML = (List<Usuario>) stream.fromXML(fonte);

popularData(fromXML);

return fromXML;

}

public void popularData(List<Usuario> listUsuario){

new UsuarioDAO().create(listUsuario);

}

}

Bom, a única novidade que temos ai é o uso da API XStream que será responsável por ler os dados do XML. Para ler os dados, como pode ver é bem simples, basta chamar xStream.fromXML(fonteOrigem); no nosso caso o local onde está o arquivo XML deverá ser passado para o argumento do método, mas poderiamos definir isso na mão grande algo como readerFile = new FileReader(new File(“nomedoarquivo.xml”));

Testando

Para testar e ver se de fato que planejamos vai acontecer, farei um unit test. Se não quiser usar unit test, pode criar a classe com o método main e executar.

A seguir temos o test passando e o banco populado:

public class LerDadosXMLTest {

@Test

public void testLerDadosXMLEPopulaNoBanco() throws FileNotFoundException{

FileReader fileReader = new FileReader(new File(“usuarios.xml”));

LerDadosXML lerDadosXML = new LerDadosXML();

assertFalse(lerDadosXML.lerXml(fileReader).isEmpty());}

}



 

Bom vou ficando por aqui, espero que tenham gostado do post.

Abracos, see ya!!

Resolvendo Data Truncation Hibernate


olá Pessoal,

O post de hoje vou falar de uma exceção que pode acontecer durante sua vida de programador. É o famoso data truncation. Se você nunca passou por ela as chances são grandes. Sabemos que é uma pratica muito comum de devs atuar como DBA, analisa de requisito, devesenvolvedor etc. Isso varia do projeto e política da empresa. Eu tenho uma opinião sobre essa pratica e até onde ela ajuda e atrapalhada no dia-dia. Mas daria um post, então não entrarei em detalhes.

lets go…

java.sql.dataTruncation hibernate could not insert

Essa exceção ela pode aparecer do nada, você pode chegar no dia seguinte e ter um bug aberto para ser corrigido com essa exceção. Respire e não se assuste. Mas, o que mudou de ontem para hoje? Pois, até ontem aplicação rodava tão bem, que não recusei o convite de um happy-hour.

O que aconteceu?

O que aconteceu é que o cara que cuida do Banco de dados, simplesmente mudou o tamanho de uma coluna(de 100 para 50) e quando o usuario foi inserir um novo dado maior que 50 para a coluna X, daí já era. Temos dados demais para aquela determinada coluna.

Solução

– Há varias soluções uma delas, é você já limitar o formulario para o tamanho X e validar esse tamanho antes de enviar os dados para o banco.

– se você está pegando dado de outro banco, se puder veja o data model e deixe sua coluna igual dos dados de origem.

Um detalhe importante é que esse tipo de dado não deveria mudar a fim de gerar um data truncation. Normalmente quando há alterações na maioria das vezes é para aumentar o capacidade, porém já passei pelo inverso também e foi data truncation na certa.

Então se você estiver passando por esse e-mail valide o tamanho dos dados que vai ser inserido no banco e veja com o responsável pelo banco como está o tamanho da coluna X data base.

Vou ficando por aqui, espero que tenham curtido a dica.

See ya!!! abraços,