2012-06-19 8 views
22

Ésta es mi estructura de base de datos, uno-a-uno mapeo en MySQL:Hibernate: intentó asignar ID de nula la propiedad de uno-a-uno: empleado

DB Schema

Este es mi archivo de java:

public class Employee { 

private EmployeeDetail empdetail; 
private String firstname; 
private String lastname; 

// getters and setters 

} 


public class EmployeeDetail { 
    private Employee employee ; 
    private int employee_id; 
    private String street; 
    private String city; 
    private String state; 
    private String country; 

// getters and setters 

} 

Este es mi archivo de asignación:

<hibernate-mapping> 

    <class name="Employee" table="employee"> 
     <id name="employee_id" type="java.lang.Integer" column="employee_id"> 
      <generator class="assigned" /> 
     </id> 
     <one-to-one name="empdetail" class="EmployeeDetail" 
      cascade="all"></one-to-one> 

     <property name="firstname" type="java.lang.String" column="firstname" /> 
     <property name="lastname" type="java.lang.String" column="lastname" /> 

    </class> 



<class name="EmployeeDetail" table="employeedetail"> 
     <id name="employee_id" type="java.lang.Integer" column="employee_id"> 
     <generator class="foreign"> 
       <param name="property">employee</param> 
      </generator> 
     </id> 
     <one-to-one name="employee" class="Employee" 
      cascade="save-update"></one-to-one> 

     <property name="street" type="java.lang.String" column="street" /> 
     <property name="city" type="java.lang.String" column="city" /> 
     <property name="state" type="java.lang.String" column="state" /> 
     <property name="country" type="java.lang.String" column="country" /> 

</class> 

</hibernate-mapping> 

Este es mi programa cliente:

Session session = factory.openSession(); 
     Transaction tx = session.beginTransaction(); 

     EmployeeDetail edetail = new EmployeeDetail(); 
     edetail.setCity("Hyd"); 
     edetail.setCountry("India"); 
     edetail.setEmployee_id(222); 
     edetail.setState("Andhra Pradesh"); 

     Employee employee = new Employee(); 

     employee.setEmployee_id(222); 
     employee.setFirstname("Pavan"); 
     employee.setLastname("Jaooi"); 
     employee.setEmpdetail(edetail); 

     session.merge(employee); 
     tx.commit(); 
     session.close(); 
     factory.close(); 

Esta es la excepción que estoy recibiendo:

INFO: Not binding factory to JNDI, no JNDI name configured 
Hibernate: select employee0_.employee_id as employee1_0_1_, employee0_.firstname as firstname0_1_, employee0_.lastname as lastname0_1_, employeede1_.employee_id as employee1_1_0_, employeede1_.street as street1_0_, employeede1_.city as city1_0_, employeede1_.state as state1_0_, employeede1_.country as country1_0_ from employee employee0_ left outer join employeedetail employeede1_ on employee0_.employee_id=employeede1_.employee_id where employee0_.employee_id=? 
Hibernate: select employeede0_.employee_id as employee1_1_0_, employeede0_.street as street1_0_, employeede0_.city as city1_0_, employeede0_.state as state1_0_, employeede0_.country as country1_0_ from employeedetail employeede0_ where employeede0_.employee_id=? 
Exception in thread "main" org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property: employee 
    at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:44) 
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99) 
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:186) 
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:240) 
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:120) 
    at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:687) 
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:669) 
    at org.hibernate.engine.CascadingAction$6.cascade(CascadingAction.java:245) 
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268) 
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216) 
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169) 
    at org.hibernate.engine.Cascade.cascade(Cascade.java:130) 
    at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456) 
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:194) 
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:240) 
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:120) 
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53) 
    at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677) 
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661) 
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665) 
    at CustomerClient.main(CustomerClient.java:31) 

Respuesta

42

Usted le dijo a Hibernate para generar el EmployeeDetail Identificación de la ID de su propiedad employee, pero nunca se ha inicializado esta propiedad.

Agregue edetail.setEmployee(employee); a su código.

+2

Gracias, pero ¿por qué employee.setEmpdetail (edetail); no es suficiente? ¿Por qué tengo que hacer edetail.setEmployee (empleado); además ?? – Pawan

+5

Porque se supone que debe mantener la coherencia del gráfico de objetos y, más importante, porque configuró la entidad EmployeeDetail con un generador de ID que obtiene el ID de EmployeeDetail de su propiedad 'employee'. Entonces, obviamente, si esta propiedad es nula, Hibernate no puede generar la ID. Eso es lo que se dice claramente en el mensaje de error. –

+3

Pensé que hibernar debería hacer esto automáticamente. Cuando una ParentEntity p tiene una colección , ¿no puede suponerse que todos los c en los hijos de p tienen un padre de p? ¿Por qué tengo que recorrerlos y configurarlos todos manualmente para evitar el error de nulo en hibernación? – pete

Cuestiones relacionadas