Relacionamento one-to-one no Hibernate

3 respostas
H

Estou aprendendo a usar o Hibernate e jpa me deparo com o seguinte problema:
Tenho duas tabelas uma cidadao e endereco com o relacionamento um - para - um . Gostaria de que quando eu criar o cidadao ele já ter o endereco e inserir no banco automaticamente. Achei algumas que diziam para usar cascade = “save-update”. Estou usando, mas esta parecendo o seguinte erro : “attempted to assign id from null one-to-one property: cidadao”. Alguem poderia me dizer o proque do erro e como corrigir.

O mapeamento do cidadao é:

<class name="Cidadao"  table="cidadao">
		
		<!-- Identificador da classe -->
		  
		<id name="codCidadao" column="cod_cidadao" >
			<generator class="native">
				<param name="sequence">cidadao_cod_cidadao_seq</param>
			</generator>
		</id>		
		<!-- Propriedades da classe -->
	
		<property name="corretude" column="corretude_cidadao" not-null="true"/>
		<property name="dataCadastro" column="data_cadastro" not-null="true"/>
		<property name="nomeCidadao" column="nome_cidadao"/>
		
		<!-- Relacionamento da Classe -->
        
        <many-to-one name="usuario" class="Usuario" fetch="select">
            <column name="cod_usuario" not-null="true" />
        </many-to-one>
        
        <many-to-one name="cidadao" class="Cidadao" not-null="false" fetch="select">
            <column name="cod_cidadao_pai"/>
        </many-to-one>        
        	
       <one-to-one name="endereco" class="endereco" cascade="save-update"  />

endereco:

<class name="Endereco" table="endereco">
		
		<!-- Identificador da classe -->
		 <id name="cod_cidadao" column="cod_cidadao"> 
        	                <generator class="foreign">
            	            <param name="property">cidadao</param>
                   	</generator>
    	        </id> 		          
		
		<!-- Propriedades da classe -->
		
		<property name="endereco"/>
		<property name="bairro"/>
		<property name="cidade"/>
		<property name="cep"/>
		
		<!-- Relacionamento da Classe -->	
		
		<one-to-one name="cidadao" class="Cidadao" constrained="true" />

no Main eu tenho :

Endereco endereco = new Endereco();
		endereco.setBairro("taguatinga");
				
		Cidadao cidadao = new Cidadao();
		cidadao.setNomeCidadao("hugo");
		cidadao.setCorretude(true);
		cidadao.setDataCadastro(new Date(11/11/2006));
		cidadao.setEndereco(endereco);
		cidadao.setUsuario(usuario);			
		
		transaction = session.beginTransaction();		
		session.save(cidadao);
		transaction.commit();	
		session.close();

só um detalhe estou usando postgre !!!

Desde já agradeço a ajuda!

3 Respostas

ramilani12

no seu relacionamento one-to-one quem é a sua FK?

&lt;one-to-one
        name="propertyName"                                          (1)
        class="ClassName"                                            (2)
        cascade="cascade_style"                                      (3)
        constrained="true|false"                                     (4)
        fetch="join|select"                                          (5)
        property-ref="propertyNameFromAssociatedClass"               (6)
        access="field|property|ClassName"                            (7)
        formula="any SQL expression"                                 (8)
        lazy="proxy|no-proxy|false"                                  (9)
        entity-name="EntityName"                                     (10)
        node="element-name|@attribute-name|element/@attribute|."
        embed-xml="true|false"
        foreign-key="foreign_key_name"
/&gt;
alberto_ribeiro

eai blz, então o que você poderia tentar é colocar da seguinte maneira;

na classe cidadao você ja tem o objeto Endereco.
colque o objeto Cidadao dentro de Endereco e mapea ao contrario também…

Endereco endereco = new Endereco();
endereco.setBairro("taguatinga");
 				
Cidadao cidadao = new Cidadao();
cidadao.setNomeCidadao("hugo");
cidadao.setCorretude(true);
cidadao.setDataCadastro(new Date(11/11/2006));
cidadao.setEndereco(endereco);
cidadao.setUsuario(usuario);			

//acrescentaer isso.
endereco.setCidadao(cidadao);
 		
transaction = session.beginTransaction();		
session.save(cidadao);
transaction.commit();	
 session.close();

se eu não me ingano é um bug do hibernate, e isso acho que já foi corrigido, mas por hora posso te indicar fazer assim…

no mapemaneto de endereco você coloca:

<one-to-one name="cidadao" class="Cidadao" cascade="save-update"  />

[]'s

fbeli

Realmente isso funciona!!!

Criado 7 de dezembro de 2006
Ultima resposta 1 de fev. de 2008
Respostas 3
Participantes 4