One-to-one - Na primeira tabela executa insert e na segunda update!

4 respostas
R

Olá pessoal.

Sou iniciante no uso do hibernate e comecei com uma aplicação simples para estudar. Versão 3.6.6.

Estou fazendo um mapeamento one-to-one. Quando mando gravar os dados o hibernate executa a seguinte instrução sql.

Hibernate: 
    insert 
    into
        pessoa
        (nome_pessoa, id_pessoa) 
    values
        (?, ?)
Hibernate: 
    update
        Endereco 
    set
        desc_endereco=? 
    where
        id_endereco=?

Sendo que deveria executar 2 inserts. Alguém saberia me ajudar a descobrir o problema?

public static void main(String[] args)
    {

        Pessoa pessoa = new Pessoa();
        pessoa.setId_pessoa(2);
        pessoa.setNome_pessoa("Nome da Pessoa");
        Endereco endereco = new Endereco();
        endereco.setId_endereco(pessoa.getId_pessoa());
        endereco.setDesc_endereco("Rua tal, numero 20");
        pessoa.setEndereco(endereco);
        int retorno = insertPessoa(pessoa);  
        JOptionPane.showMessageDialog(null, "Código cadastrado: " + retorno);
     }

    public static int insertPessoa(Pessoa pessoa)
    {

        try
        {
            Session sessao = HibernateUtil.getSession();

            Transaction tspessoa = sessao.beginTransaction();
            sessao.save(pessoa);
            tspessoa.commit();
            sessao.close();
            return pessoa.getId_pessoa();
        }
        catch (Exception erro)
        {
            JOptionPane.showMessageDialog(null, "Erro na Inserção: " + erro);
            return 0;
        }

    }

Meus arquivos hbm estão assim:
Endereco.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
<hibernate-mapping package="br.com.optionsistemas.onetoone">
  <class name="Endereco" table="Endereco">
    <id name="id_endereco" column="id_endereco" type="integer" unsaved-value="null">
    </id>
    <property name="desc_endereco"/>
  </class>
</hibernate-mapping>

Pessoa.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
<hibernate-mapping package="br.com.optionsistemas.onetoone">
    <class name="Pessoa" table="pessoa">
        <id name="id_pessoa" column="id_pessoa" type="integer" unsaved-value="null">
        </id>
        <property name="nome_pessoa"/>
        <one-to-one 
        class="br.com.optionsistemas.onetoone.Endereco" 
        cascade="all"
        name="endereco" 
        />
    </class>
</hibernate-mapping>

arquivo hibernate.cfg

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <mapping resource="br/com/optionsistemas/onetoone/Pessoa.hbm.xml"/>
    <mapping resource="br/com/optionsistemas/onetoone/Endereco.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

arquivo hibernate.properties

hibernate.connection.driver_class = org.firebirdsql.jdbc.FBDriver
hibernate.connection.url = jdbc:firebirdsql:localhost/3050:C:\\BDTest\\BaseAssociations.FDB
hibernate.connection.username = SYSDBA
hibernate.connection.password = masterkey
hibernate.dialect = org.hibernate.dialect.FirebirdDialect
hibernate.show_sql = true
hibernate.format_sql = true
hibernate.connection.charset = ISO8859_1
hibernate.connection.lc_ctype = ISO8859_1
hibernate.pool_size = 10

4 Respostas

ivandasilva

Se você quer fazer dois insert’s tem que ser um dado que não exista na segunda tabela, onde, o Hibernate esta fazendo o Update, você esta utilizando o Cascade.Type=ALL que ele faz todo o tipo Insert,Merge,Delete e Update inclusive.

R

Bom dia Ivan

Não há dados na segunda tabela.
Também testei com

e continua na mesma.

M

Meu problema é justamente o contrário… preciso que ele faça insert na primeira e update na segunda, mas está tentando fazer insert nas duas tabelas e tá dando o erro: detached entity passed to persist. Estou usando annotations ao invés dos arquivos hbm.xml.

R

Bom dia

Consegui achar a solução:

O problema estava na linha:

<id name="id_endereco" column="id_endereco" type="integer" unsaved-value="null">
do mapeamento da classe endereco. Ficou assim:

Criado 6 de agosto de 2011
Ultima resposta 9 de ago. de 2011
Respostas 4
Participantes 3