2012-06-19 24 views
22

này được cấu trúc cơ sở dữ liệu của tôi, One-to-One lập bản đồ trong MySQL:Hibernate: cố gắng gán id từ vô sở hữu one-to-one: nhân viên

DB Schema

Đây chính là file java của tôi:

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 

} 

Đây là tập tin bản đồ của tôi:

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

Đây là chương trình khách hàng của tôi:

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(); 

Đây là ngoại lệ Tôi nhận:

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) 

Trả lời

42

Bạn nói với Hibernate để tạo ra EmployeeDetail ID từ ID của tài sản employee của nó, nhưng bạn không bao giờ khởi khách sạn này.

Thêm edetail.setEmployee(employee); vào mã của bạn.

+2

Cảm ơn, nhưng tại sao employee.setEmpdetail (edetail); không đủ? tại sao tôi cần phải làm edetail.setEmployee (nhân viên); cũng thế ?? – Pawan

+5

Vì bạn phải duy trì sự gắn kết của biểu đồ đối tượng và quan trọng hơn, bởi vì bạn đã cấu hình thực thể EmployeeDetail với trình tạo ID nhận ID của EmployeeDetail từ thuộc tính 'employee' của nó. Vì vậy, rõ ràng, nếu tài sản này là null, Hibernate không thể tạo ID. Đó là những gì được nói rõ ràng trong thông báo lỗi. –

+3

Tôi nghĩ hibernate là nghĩa vụ phải làm điều này tự động. Khi một ParentEntity p có một bộ sưu tập , có thể không được giả định rằng tất cả c trong con của p có một phụ huynh của p? Tại sao tôi phải lặp lại và đặt tất cả chúng theo cách thủ công để tránh lỗi id null trong chế độ ngủ đông? – pete

Các vấn đề liên quan