Duvida com Hibernate.. (Chave Estrangeira)

Pessoal.

Estou com algumas dúvidas em Hibernate, se alguém puder me dar uma luz… hehehe agradeço… :smiley:

Seguinte… tenho duas classes cliente e endereco

A classe cliente sózinha está inserindo no hibernate normalmente, só que eu não estou conseguindo inserir no caso da classe endereço automaticamente…

Eu tenho na minha classe cliente um campo chamado endereco…

Abaixo estão meus códigos… onde estou errando ? :shock:

Valeu

Rodrigo

cliente.java

package br.org.interfarma.classes;
/*
 * cliente.java
 *
 * Created on 16 de Março de 2007, 11:14
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/**
 *
 * @author kleins
 */
public class cliente {
    
    /** Creates a new instance of cliente */
    public cliente() {
    }

    private String nome;

    private String sobrenome;

    private Integer id;
    
   

    public String getNome() {
        return nome;
    }

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

    public String getSobrenome() {
        return sobrenome;
    }

    public void setSobrenome(String sobrenome) {
        this.sobrenome = sobrenome;
    }

    public Integer getId() {
        return id;
    }

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

    private endereco endereco;

    public endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(endereco endereco) {
        this.endereco = endereco;
    }

    
    
}

e endereco.java

/*
 * endereco.java
 *
 * Created on 19 de Março de 2007, 15:53
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package br.org.interfarma.classes;

/**
 *
 * @author kleins
 */
public class endereco {
    
    /** Creates a new instance of endereco */
    public endereco() {
    }

    private Integer id;

    private String rua;

    private int numero;

    public Integer getId() {
        return id;
    }

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

    public String getRua() {
        return rua;
    }

    public void setRua(String rua) {
        this.rua = rua;
    }

    public int getNumero() {
        return numero;
    }

    public void setNumero(int numero) {
        this.numero = numero;
    }

    private cliente cliente;

    public cliente getCliente() {
        return cliente;
    }

    public void setCliente(cliente cliente) {
        this.cliente = cliente;
    }
    
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

        <class name="br.org.interfarma.classes.cliente" table="cliente">
           
            <id name="id" column="id">
            <generator class="sequence">
                <param name="sequence">hibernate_sequence</param>
            </generator>
            </id>
             <property name="nome"  type="string"/>
             <property name="sobrenome" type="string" />
   
        </class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

        <class name="br.org.interfarma.classes.endereco" table="endereco">
           
             <id name="id" column="id">
                 <generator class="sequence">
                     <param name="sequence">endereco_seq</param>
                 </generator>
             </id>
             <property name="rua"  type="string"/>
             <property name="numero" type="string"/>
             
             <many-to-one name="cliente" column="cliente" class="br.org.interfarma.classes.cliente" cascade="none"/>

        </class>

</hibernate-mapping>

kleins,

Dá uma olhada no PDF que vem no próprio Hibernate, o caminho é: <diretório do hibernate>\doc\reference\en\pdf.

Você não colocou o código de como você está fazendo a persistencia. Ou você tem que dar um save no endereço ou o “cascade” que está no mapeamento do endereço não pode estar “none”.

Dá uma lida do capitulo 4 ao 9 que vai te ajudar bastante.

ASOBrasil

Valeu… vou ler…

Então…
Eu estava dando um save apenas no cliente, acreditando que o endereço tb seria salvo…

Individualmente funciona, mas vou ler pra fazer o insert direito.

Valeu.

Rodrigo

Fala pessoal.

Dei uma mudada mas não está correto ainda… ainda continua salvando o cliente, mas não salva o endereço.

cliente.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
        <class name="br.org.interfarma.classes.cliente" table="cliente">
            <id name="id" column="id">
            <generator class="sequence">
                <param name="sequence">hibernate_sequence</param>
            </generator>
            </id>
             <property name="nome"  type="string"/>
             <property name="sobrenome" type="string" />
             <one-to-one name="endereco" class="br.org.interfarma.classes.endereco"  />
        </class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

        <class name="br.org.interfarma.classes.endereco" table="endereco">
           
             <id name="id" column="id">
                 <generator class="foreign">
                     <param name="property">cliente</param>
                 </generator>
             </id>
             <property name="rua"  type="string"/>
             <property name="numero" type="int"/>
             
             <one-to-one name="cliente" class="br.org.interfarma.classes.cliente" cascade="all" constrained="true"/>
        </class>
</hibernate-mapping>

E estou chamando a gravação da seguinte forma.

public static void grava() {

               endereco end = new endereco();
               
               end.setRua("Felix Pereira de Castro");
               end.setNumero(1000);
               
               
               cliente cli = new cliente();
               
               Integer id = new Integer(21);

               //cli.setId(id);
               cli.setNome("Rodrigoooo");
               cli.setSobrenome("Kleinnnn");
               cli.setEndereco(end);
               
               Session sessao = HibernateUtility.getSession(); 
               
               Transaction transaction = sessao.beginTransaction(); 
               sessao.saveOrUpdate(cli);   
               //sessao.saveOrUpdate(end);  
               
               transaction.commit();  
               sessao.close();            
}

Valeu…

Rodrigo

kleins,

Não sei se é isso, mas você tentou passar o “cascade=all” para o hbm do cliente?

ASOBrasil

Fala ASO…

Então… se eu coloco o cascade=“all” no hbm do cliente ele me lança uma Exception…

Não sei oque pode ser… rs enqto isso continuo lendo a documentação… :o)

Obrigado pelas dicas que vc vem passando.

[]'s

Rodrigo

org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: cliente org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:44) org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70) org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507) org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499) org.hibernate.engine.CascadingAction$1.cascade(CascadingAction.java:218) org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268) org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216) org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169) org.hibernate.engine.Cascade.cascade(Cascade.java:130) org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456) org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:334) org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181) org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70) org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507) org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499) org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495) br.org.interfarma.DAO.clienteDAO.grava(clienteDAO.java:48) post.processRequest(post.java:48) post.doGet(post.java:67) javax.servlet.http.HttpServlet.service(HttpServlet.java:689) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)