2015-03-31 34 views
1

在我的單元測試中,我得到了JpaSystemException: ids for this class must be manually assigned before calling save() error。我重寫了我的實體,使問題更短,更易讀。休眠一對一單向 - 未分配的ID

所以學生與表EnrolledInfo有一個可選的一對一關係。

學生實體

@Entity 
@Table(name = "Student") 
public class Student { 

    @Id 
    @Column(name = "studentId") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long studentId; 

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "student", cascade = CascadeType.ALL) 
    private EnrolledInfo enrolledInfo; 

    private String firstName; 

    private String lastName; 

    // setters&getters etc..  
} 

EnrolledInfo實體

@Entity 
@Table(name = "EnrolledInfo") 
public class EnrolledInfo implements Serializable { 

    @Id 
    private Long studentId; 

    @OneToOne(fetch = FetchType.Eager) 
    @PrimaryKeyJoinColumn 
    @JsonBackReference 
    private Student student; 

    @Column(name = "enrolledDate") 
    private Date enrolledDate; 

    @Column(name = "paidTuition") 
    private Boolean paidTuition; 

    // setters&getters etc.. 
} 

將其組合在一起的試驗(此錯誤)

當然我沒有保存就讀在保存學生之前的信息實體?

@Test 
public void student_test() { 

    Student student = new Student(); 
    EnrolledInfo enrolledInfo = new EnrolledInfo(); 
    enrolledInfo.setPaidTuition(true); 

    student.setEnrolledInfo(enrolledInfo);   
    studentDao.save(student); 
    // errors on // JpaSystemException: ids for this class must be manually assigned before calling save(): 
} 

回答

1

你EnrolledInfo具有studentId作爲其標識,並沒有生成策略導致其IDS來自於關係,因爲它是其父ID(學生)。爲了這個工作,學生必須在保存期間被認識。

所以EnrolledInfo必須知道它的學生,jpa不處理關係本身的兩個方面,所以他們可以手動設置。

Student student = new Student(); 
    EnrolledInfo enrolledInfo = new EnrolledInfo(); 
    enrolledInfo.setPaidTuition(true); 
    enrolledInfo.setStudent(student); 

    student.setEnrolledInfo(enrolledInfo);   
    studentDao.save(student); 

現在JPA2,適當的註釋爲:

@Entity 
@Table(name = "EnrolledInfo") 
public class EnrolledInfo implements Serializable { 

    @Id 
    private Long studentId; 

    @OneToOne(fetch = FetchType.Eager) 
    @Id 
    @JsonBackReference 
    private Student student; 
在JPA1

與@PrimaryKeyJoinColumn您需要提供完整的映射(你現在應該使用JPA2,所以沒有理由舊的,但以防萬一):

@Entity 
@Table(name = "EnrolledInfo") 
public class EnrolledInfo implements Serializable { 

    @Id 
    @Column(name="STUDENT_ID") 
    private Long studentId; 

    @OneToOne(fetch = FetchType.Eager) 
    @PrimaryKeyJoinColumn(name="STUDENT_ID", referencedColumnName="STUDENT_ID") 
    @JsonBackReference 
    private Student student;