2017-03-15 71 views
0

我对此很新,我试图在Student对象和Grades对象之间建立一个简单的一对一关系。我正在使用hsqldb内存数据库进行spring引导。我会先显示我的代码然后解释我的问题。如何正确设置@OneToOne与JPA Hibernate的关系?

Student.java

@Entity 
public class Student { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String firstName; 
    private String lastName; 

    @OneToOne(cascade = CascadeType.ALL) 
    private Grades grades; 

    //Getters and setters 
} 

Grades.java

@Entity 
    public class Grades { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private int midterm; 
    private int finalExam; 

    @OneToOne(cascade = CascadeType.ALL) 
    private Student student; 

    //Getters and setters 
} 

StudentRepository.java

public interface StudentRepository extends JpaRepository<Student, Long> { 
} 
  1. 是我的设置对学生和成绩是否正确?我只是一个简单的一对一关系,我将Grades ID作为外键存储在一个Student对象中。

  2. 每当我使用new Grades()创建Grades对象并将其传递给构造函数中的Student对象时,它允许我将相同的Grades对象分配给多个学生。当他们用一对一的方式进行注释时,这怎么可能?

  3. 我打开了hibernate sql logging,看看使用数据库时发生了什么。它似乎将grades_id存储在Student对象中很好,但它显示Grades对象中的student_id为空。为什么这是null?

感谢您的任何帮助。

回答

1

我的学生和年级的设置是否正确?

这是值得怀疑的。关系的两边都被映射为关系的所有者。其中一个应映射为所有者,另一个应使用@OneToOne注释的mappedBy属性。 @OneToOne

每当我创建了一个档次使用新牌号对象(),并传递到 在构造一个Student对象,它可以让我指定 同等级反对多个学生。 他们用一对一的方式进行注释时,这怎么可能?

您应该创建复合主键或使用唯一性约束使用相同Grades记录由多个Student s到禁止。

我打开了hibernate sql logging,看看使用 数据库时发生了什么。它似乎将grades_id存储在一个Student对象中,只是 很好,但它显示Grades对象中的student_id为空。为什么 是空的?

看起来像Hibernate生成这两个表与外键列。只有一个应该产生。

您必须指定一方作为关系的所有者。另一方应该使用@OneToOne批注的mappedBy属性来告诉Hibernate关系映射的位置。

... 
@OneToOne(mappedBy="grades") 
private Student student; 
... 
+0

谢谢,非常有帮助 – DraegerMTN