Como trabalhar com Hibernate envovendo 2 objetos relacionados?
12 respostas
Valter_Henrique
Oi GUJ,
galera, eu tenho um objeto ‘Usuario’ e esse objeto usuario tem um atributo ‘tag’, então o hibernate configurou dessa forma:
// classe usuarioprivateStringemail;privateStringnome;privateStringsenha;privateStringgenero;privateDatedataNascimento;privateSettags=newHashSet(0);
// classe tagprivateStringemail;privateUsuariousuario;privateStringcodigo;
Como que eu faço para fazer um insert nesse caso ?
Estou fazendo dessa forma por enquanto (e que não esta funcionando):
Usuariousuario=newUsuario(email,nome,senha,genero,data);// aqui fazer a leitura do código da TAGTagtag=newTag(email,usuario,"VVVVVVVVVV");Settags=newHashSet(0);tags.add(tag);usuario.setTags(tags);BancoDadosbd=newBancoDados();Stringstatus=bd.cadastrarUsuario(usuario);
No relacionamento precisa colocar um cascade = CascadeType.ALL.
Lembre-se de criar os métodos hash e equals para as entidades, usando apenas o ID.
Valter_Henrique
aluisiodsv:
Está usando annotations ?
No relacionamento precisa colocar um cascade = CascadeType.ALL.
Lembre-se de criar os métodos hash e equals para as entidades, usando apenas o ID.
Oi Aluisio,
eu estou começando no hibernate cara, como eu sei se estou usando annotation ?
E aonde coloco este cascade ?
Estes métodos hash e equals utilizando apenas o ID é porque como eh uma hashset ela cria identificadores únicos para os objetos, certo ?
oddy.silva
Sua classe tag tem um Usuário.
Então você primeiro salva o Usuário, depois seta ele na Tag e salva a Tag.
Eu costumo fazer assim e funciona direitinho também:
Exemplo:
Usuario u = new Usuario();
new UsuarioDao().save(u);
Tag t = new Tag();
t.setUsuario(u);
new TagDao().save(t);
Resumindo, salve o Usuário primeiro, depois salve a Tag. Flw
aluisiodsv
oddy.silva disse uma boa alternativa, mas não funcionaria se fosse um relacionamento bidirecional.
Apesar de ser mais correto salvar um de cada vez neste caso, as vezes usar o cascade pode ser uma boa e fácil opção.
Como você mapeia as entidades no hibernate ?
Com arquivos xml ou com as anotações java ?
Mande sua classe inteira aqui.
Valter_Henrique
oddy.silva:
Sua classe tag tem um Usuário.
Então você primeiro salva o Usuário, depois seta ele na Tag e salva a Tag.
Eu costumo fazer assim e funciona direitinho também:
Exemplo:
Usuario u = new Usuario();
new UsuarioDao().save(u);
Tag t = new Tag();
t.setUsuario(u);
new TagDao().save(t);
Resumindo, salve o Usuário primeiro, depois salve a Tag. Flw
Valeu brother, deu certinho.
Agora eu entendi porque o hibernate criou este atributo ‘Usuario’ na classe ‘Tag’.
Valeu cara.
Valter_Henrique
aluisiodsv:
oddy.silva disse uma boa alternativa, mas não funcionaria se fosse um relacionamento bidirecional.
Apesar de ser mais correto salvar um de cada vez neste caso, as vezes usar o cascade pode ser uma boa e fácil opção.
Como você mapeia as entidades no hibernate ?
Com arquivos xml ou com as anotações java ?
Mande sua classe inteira aqui.
O mapeamento é feito via .xml:
//classe TagpackageEntidades;// Generated 24/01/2011 11:44:30 by Hibernate Tools 3.2.1.GA/** * Tag generated by hbm2java */publicclassTagimplementsjava.io.Serializable{privateStringemail;privateUsuariousuario;privateStringcodigo;publicTag(){}publicTag(Stringemail,Usuariousuario,Stringcodigo){this.email=email;this.usuario=usuario;this.codigo=codigo;}publicStringgetEmail(){returnthis.email;}publicvoidsetEmail(Stringemail){this.email=email;}publicUsuariogetUsuario(){returnthis.usuario;}publicvoidsetUsuario(Usuariousuario){this.usuario=usuario;}publicStringgetCodigo(){returnthis.codigo;}publicvoidsetCodigo(Stringcodigo){this.codigo=codigo;}}
XML da Classe Tag
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 24/01/2011 11:44:34 by Hibernate Tools 3.2.1.GA --><hibernate-mapping><classname="Entidades.Tag"table="tag"catalog="autolife"><idname="email"type="string"><columnname="email"length="50"/><generatorclass="assigned"/></id><many-to-onename="usuario"class="Entidades.Usuario"update="false"insert="false"fetch="select"><columnname="email"length="50"not-null="true"unique="true"/></many-to-one><propertyname="codigo"type="string"><columnname="codigo"length="20"not-null="true"/></property></class></hibernate-mapping>
//classe usuariopackageEntidades;// Generated 24/01/2011 11:44:30 by Hibernate Tools 3.2.1.GAimportjava.util.Date;importjava.util.HashSet;importjava.util.Iterator;importjava.util.Set;/** * Usuario generated by hbm2java */publicclassUsuarioimplementsjava.io.Serializable{privateStringemail;privateStringnome;privateStringsenha;privateStringgenero;privateDatedataNascimento;privateSettags=newHashSet(0);publicUsuario(){}publicUsuario(Stringemail,Stringnome,Stringsenha,Stringgenero,DatedataNascimento){this.email=email;this.nome=nome;this.senha=senha;this.genero=genero;this.dataNascimento=dataNascimento;}publicUsuario(Stringemail,Stringnome,Stringsenha,Stringgenero,DatedataNascimento,Settags){this.email=email;this.nome=nome;this.senha=senha;this.genero=genero;this.dataNascimento=dataNascimento;this.tags=tags;}publicStringgetEmail(){returnthis.email;}publicvoidsetEmail(Stringemail){this.email=email;}publicStringgetNome(){returnthis.nome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetSenha(){returnthis.senha;}publicvoidsetSenha(Stringsenha){this.senha=senha;}publicStringgetGenero(){returnthis.genero;}publicvoidsetGenero(Stringgenero){this.genero=genero;}publicDategetDataNascimento(){returnthis.dataNascimento;}publicvoidsetDataNascimento(DatedataNascimento){this.dataNascimento=dataNascimento;}publicSetgetTags(){returnthis.tags;}publicvoidsetTags(Settags){this.tags=tags;}publicvoidexibir(){System.out.println("Usuario{"+"email="+email+"nome="+nome+"senha="+senha+"genero="+genero+"dataNascimento="+dataNascimento.toString()+'}');Iteratorit=tags.iterator();while(it.hasNext()){Tagtag=(Tag)it.next();System.out.println("tag código= "+tag.getCodigo());}}}
XML da classe ‘Usuario’:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 24/01/2011 11:44:34 by Hibernate Tools 3.2.1.GA --><hibernate-mapping><classname="Entidades.Usuario"table="usuario"catalog="autolife"><idname="email"type="string"><columnname="email"length="50"/><generatorclass="assigned"/></id><propertyname="nome"type="string"><columnname="nome"length="50"not-null="true"/></property><propertyname="senha"type="string"><columnname="senha"length="20"not-null="true"/></property><propertyname="genero"type="string"><columnname="genero"length="9"not-null="true"/></property><propertyname="dataNascimento"type="date"><columnname="data_nascimento"length="10"not-null="true"/></property><setname="tags"inverse="true"><key><columnname="email"length="50"not-null="true"unique="true"/></key><one-to-manyclass="Entidades.Tag"/></set></class></hibernate-mapping>
aluisiodsv
Mude logo para Annotations. Funcionalidade de anotação incluída na versão 1.5 do java. Já faz bastante tempo já!
Aluisio, a única diferença que eu vi, do seu para o meu é que você inclui :
O que isso irá fazer no meu código ?
E o que é o ‘annotations’ ?
aluisiodsv
O cascade vai fazer operações em Cascata. Conforme vc alterar as outras entidades q estão relacionadas a esta, automaticamente, ao gravar, ele já altera tudo no banco de dados.
Annotations é uma funcionalidade nova que veio a partir do java 1.5.
No caso do hibernate, ao invés de fazer toda aquela configuração em xml, é só usá-la. Assim:
Observe o “@” …
Ele faz tudo o que vc faria em xml, só q muito mais fácil…
Valter_Henrique
aluisiodsv:
O cascade vai fazer operações em Cascata. Conforme vc alterar as outras entidades q estão relacionadas a esta, automaticamente, ao gravar, ele já altera tudo no banco de dados.
Annotations é uma funcionalidade nova que veio a partir do java 1.5.
No caso do hibernate, ao invés de fazer toda aquela configuração em xml, é só usá-la. Assim:
Observe o “@” …
Ele faz tudo o que vc faria em xml, só q muito mais fácil…
Muito interessante Aluisio, obrigado pela dica.
Vou estudar sobre annotations, com certeza,rs.
oddy.silva
Fala Valter Henrique, blz?
Olha, estuda Hibernate Annotations que sua vida será bem mais feliz, rsrs Eu aprendi Hibernate pela apostila FJ-21 da Caelum + Documentacao do Hibernate. É bem facinho, bem facinho mesmo.
Sobre o cascade, que eu não mostrei no exemplo, ele é muito mais poderoso do que salvar um de cada vez. Por exemplo:
Da maneira que eu te ensinei, se você não criar uma validação, há o risco de o objeto User ser salvo e o objeto Tag não. Isso faria com que o banco tivesse um
objeto User associado a nenhuma Tag. Se você aprender a verificar os passo-a-passos em salvar um objeto de cada vez, sem problemas. Mas se você aprender
a usar o cascade algum dia, eu recomendo.
Flw
Valter_Henrique
oddy.silva:
Fala Valter Henrique, blz?
Olha, estuda Hibernate Annotations que sua vida será bem mais feliz, rsrs Eu aprendi Hibernate pela apostila FJ-21 da Caelum + Documentacao do Hibernate. É bem facinho, bem facinho mesmo.
Sobre o cascade, que eu não mostrei no exemplo, ele é muito mais poderoso do que salvar um de cada vez. Por exemplo:
Da maneira que eu te ensinei, se você não criar uma validação, há o risco de o objeto User ser salvo e o objeto Tag não. Isso faria com que o banco tivesse um
objeto User associado a nenhuma Tag. Se você aprender a verificar os passo-a-passos em salvar um objeto de cada vez, sem problemas. Mas se você aprender
a usar o cascade algum dia, eu recomendo.
Flw
Muito obrigado pelas dicas oddy =)
Vou baixar essa apostila da Caelum agora mesmo,rs.