java - Hibernate 一对一单向 - id 未分配

标签 java spring hibernate one-to-one

在我的单元测试中,我收到JpaSystemException:此类的 ids 必须在调用 save() 之前手动分配错误。我重新措辞了我的实体,使问题更短、更具可读性。

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

最佳答案

您的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;

关于java - Hibernate 一对一单向 - id 未分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29370292/

相关文章:

java - Spring + Hibernate annotatedPackages 标签不起作用

spring - Spring 数据中的标准

java - Sherlock Activity 中的 Intent.FLAG_ACTIVITY_CLEAR_TOP 未达到目的

Java vector 容量求 vector 大小

java - 是否可以将 Spring Restdocs 与 Jersey 应用程序一起使用

hibernate - 在这种情况下覆盖 Hibernate 延迟加载的最佳方法

不同方法中的 Java 数组

java - 无法在 Android 模拟器中滚动

spring - 如何将 Java 6 中的 TLS 1.2 与 Apache HttpClient 一起使用?

java - ehcache上的@Cacheable方法和@Cacheable类有什么区别