【问题标题】:Hibernate one to one unidirectional - ids not assigned休眠一对一单向-未分配ID
【发布时间】:2015-03-31 13:55:56
【问题描述】:

在我的单元测试中,我得到了JpaSystemException: ids for this class must be manually assigned before calling save() error。我已经改写了我的实体以使问题更短且更具可读性。

因此 student 与表 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():
}

【问题讨论】:

    标签: java spring hibernate one-to-one


    【解决方案1】:

    您的 EnrolledInfo 将 studentId 作为其 Id,并且没有生成策略导致其 id 来自关系,因为它是其父 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;
    

    在带有@PrimaryKeyJoinColumn 的 JPA1 中,您需要提供完整的映射(您现在应该使用 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;
    

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多