代码之家  ›  专栏  ›  技术社区  ›  Robbo_UK

休眠一对一单向-未分配ID

  •  1
  • Robbo_UK  · 技术社区  · 11 年前

    在我的单元测试中 JpaSystemException: ids for this class must be manually assigned before calling save() error 。我已重新编写了我的实体,使问题更简短、更易读。

    因此,学生与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 回复  |  直到 11 年前
        1
  •  1
  •   Zielu    11 年前

    您的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;
    
    推荐文章