Como trabalhar com Hibernate envovendo 2 objetos relacionados?

Oi GUJ,
galera, eu tenho um objeto ‘Usuario’ e esse objeto usuario tem um atributo ‘tag’, então o hibernate configurou dessa forma:

     // classe usuario
     private String email;
     private String nome;
     private String senha;
     private String genero;
     private Date dataNascimento;
     private Set tags = new HashSet(0);
    // classe tag
     private String email;
     private Usuario usuario;
     private String codigo;

Como que eu faço para fazer um insert nesse caso ?
Estou fazendo dessa forma por enquanto (e que não esta funcionando):

        Usuario usuario = new Usuario(email, nome, senha, genero, data);

        // aqui fazer a leitura do código da TAG
        Tag tag = new Tag(email, usuario, "VVVVVVVVVV");
        Set tags = new HashSet(0);
        tags.add(tag);

        usuario.setTags(tags);

        BancoDados bd = new BancoDados();
        String status = bd.cadastrarUsuario(usuario);

E então no meu banco:

    public String cadastrarUsuario(Usuario usuario) {
        String status = "cadastro_sucesso";

        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();

        try {
            session.save(usuario);
            session.getTransaction().commit();
        } catch (HibernateException he) {
            session.getTransaction().rollback();
            System.out.println("Exceção em Banco de dados - cadastrarUsuario:" + he.getCause().getLocalizedMessage());
            status = he.getCause().getLocalizedMessage();
        } finally {
            session.clear();
            session.close();
        }

        return status;
    }

Ele não insere a tag ao usuario…

Como eu trabalho com estes dois objetos relacionados no hibernate ?

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.

[quote=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.[/quote]

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 ?

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

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.

[quote=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[/quote]
Valeu brother, deu certinho.
Agora eu entendi porque o hibernate criou este atributo ‘Usuario’ na classe ‘Tag’.

Valeu cara.

[quote=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.[/quote]

O mapeamento é feito via .xml:

//classe Tag

package Entidades;
// Generated 24/01/2011 11:44:30 by Hibernate Tools 3.2.1.GA

/**
 * Tag generated by hbm2java
 */
public class Tag  implements java.io.Serializable {


     private String email;
     private Usuario usuario;
     private String codigo;

    public Tag() {
    }

    public Tag(String email, Usuario usuario, String codigo) {
       this.email = email;
       this.usuario = usuario;
       this.codigo = codigo;
    }
   
    public String getEmail() {
        return this.email;
    }
    
    public void setEmail(String email) {
        this.email = email;
    }
    public Usuario getUsuario() {
        return this.usuario;
    }
    
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    public String getCodigo() {
        return this.codigo;
    }
    
    public void setCodigo(String codigo) {
        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>
    <class name="Entidades.Tag" table="tag" catalog="autolife">
        <id name="email" type="string">
            <column name="email" length="50" />
            <generator class="assigned" />
        </id>
        <many-to-one name="usuario" class="Entidades.Usuario" update="false" insert="false" fetch="select">
            <column name="email" length="50" not-null="true" unique="true" />
        </many-to-one>
        <property name="codigo" type="string">
            <column name="codigo" length="20" not-null="true" />
        </property>
    </class>
</hibernate-mapping>
    //classe usuario

package Entidades;
// Generated 24/01/2011 11:44:30 by Hibernate Tools 3.2.1.GA


import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Usuario generated by hbm2java
 */
public class Usuario  implements java.io.Serializable {


     private String email;
     private String nome;
     private String senha;
     private String genero;
     private Date dataNascimento;
     private Set tags = new HashSet(0);

    public Usuario() {
    }
	
    public Usuario(String email, String nome, String senha, String genero, Date dataNascimento) {
        this.email = email;
        this.nome = nome;
        this.senha = senha;
        this.genero = genero;
        this.dataNascimento = dataNascimento;
    }
    public Usuario(String email, String nome, String senha, String genero, Date dataNascimento, Set tags) {
       this.email = email;
       this.nome = nome;
       this.senha = senha;
       this.genero = genero;
       this.dataNascimento = dataNascimento;
       this.tags = tags;
    }
   
    public String getEmail() {
        return this.email;
    }
    public void setEmail(String email) {
        this.email = email;
    }

    public String getNome() {
        return this.nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSenha() {
        return this.senha;
    }
    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getGenero() {
        return this.genero;
    }
    public void setGenero(String genero) {
        this.genero = genero;
    }

    public Date getDataNascimento() {
        return this.dataNascimento;
    }
    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public Set getTags() {
        return this.tags;
    }
    public void setTags(Set tags) {
        this.tags = tags;
    }


    public void exibir() {
        System.out.println("Usuario{" + "email=" + email + "nome=" + nome + "senha=" + senha + "genero=" + genero + "dataNascimento=" + dataNascimento.toString() + '}');
        
        Iterator it = tags.iterator();
        while(it.hasNext()){
            Tag tag = (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>
    <class name="Entidades.Usuario" table="usuario" catalog="autolife">
        <id name="email" type="string">
            <column name="email" length="50" />
            <generator class="assigned" />
        </id>
        <property name="nome" type="string">
            <column name="nome" length="50" not-null="true" />
        </property>
        <property name="senha" type="string">
            <column name="senha" length="20" not-null="true" />
        </property>
        <property name="genero" type="string">
            <column name="genero" length="9" not-null="true" />
        </property>
        <property name="dataNascimento" type="date">
            <column name="data_nascimento" length="10" not-null="true" />
        </property>
        <set name="tags" inverse="true">
            <key>
                <column name="email" length="50" not-null="true" unique="true" />
            </key>
            <one-to-many class="Entidades.Tag" />
        </set>
    </class>
</hibernate-mapping>

Mude logo para Annotations. Funcionalidade de anotação incluída na versão 1.5 do java. Já faz bastante tempo já!

  <set name="tags" inverse="true" cascade="save-update">  
    <key>  
      <column name="email" length="50" not-null="true" unique="true" />  
    </key>  
    <one-to-many class="Entidades.Tag" />  
  </set>

[quote=aluisiodsv]Mude logo para Annotations. Funcionalidade de anotação incluída na versão 1.5 do java. Já faz bastante tempo já!

<set name="tags" inverse="true" cascade="save-update"> <key> <column name="email" length="50" not-null="true" unique="true" /> </key> <one-to-many class="Entidades.Tag" /> </set> [/quote]

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’ ?

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:

@Entity
public class Usuario {

  private Integer id;
  private String nome;

  @Id
  @Column(configurações adicionais ...)
  public Integer getId() {
    return this.id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  @Column(configurações adicionais ...)
  public String getNome() {
    return this.nome;
  }

  public void setNome(String nome) {
    this.nome = nome;
  }

}

Observe o “@” …
Ele faz tudo o que vc faria em xml, só q muito mais fácil…

[quote=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:

@Entity
public class Usuario {

  private Integer id;
  private String nome;

  @Id
  @Column(configurações adicionais ...)
  public Integer getId() {
    return this.id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  @Column(configurações adicionais ...)
  public String getNome() {
    return this.nome;
  }

  public void setNome(String nome) {
    this.nome = nome;
  }

}

Observe o “@” …
Ele faz tudo o que vc faria em xml, só q muito mais fácil…[/quote]

Muito interessante Aluisio, obrigado pela dica.
Vou estudar sobre annotations, com certeza,rs.

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

[quote=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
[/quote]

Muito obrigado pelas dicas oddy =)
Vou baixar essa apostila da Caelum agora mesmo,rs.