如何强制零对一关系?

时间:2014-05-14 06:38:19

标签: java hibernate hibernate-mapping

我的要求是列出每个班级的班级和学生。每个学生必须在零或最多一个班级。我的代码如下,但在数据库中,每个学生都可以在很多课程中。如何让每个学生保持零到一,只有一个班级?

学生项目表如下

StudentItem

id student_id code
1    1         233
2    5         453
3    1         567
4    6         565

实体

@Entity
public class MyClass{

   @Id
   @GeneratedValue
   private long id;
   @OneToMany( cascade = CascadeType.ALL)
   @LazyCollection(LazyCollectionOption.FALSE)
   private List<StudentItem> students;
   private String season;
   ...
}

@Entity
public class StudentItem{
   @Id
   @GeneratedValue
   private long id;
   @OneToOne
   private Student student;
   private String code;
   ...
}

@Entity
public class Student{
   @Id
   @GeneratedValue
   private long id;
   private String fname;
   private String lname;
   ....
}

1 个答案:

答案 0 :(得分:0)

在我看来,这是MyClassStudentItem之间的多对一关系,MyClass拥有它们之间的关系。此外,可以在这两个实体之间使用连接表更简单,更直接;这样,您就不会冒在数据库中创建多个MyClass条目的风险。

这样想:一个班级和一个学生之间的实际有效关系是什么?根据您的描述,一个班级可能会容纳许多学生,但任何给定的学生可能只在一个班级。

以下是关于如何创建它的记忆的粗略示例。我假设StudentItemMyClass之间有一个名为classroom_students的加入表,列student_item_idclass_id

@Entity
public class MyClass {
    @Id
    @GeneratedValue
    private Integer id;

    @OneToMany
    @JoinTable(name = "classroom_students",
               joinColumns = @JoinColumn(name = "student_item_id"),
               inverseJoinColumns = @JoinColumn(name = "class_id"))
    private List<MyClass> students;

    // getters and setters for entity
}


@Entity
public class StudentItem {
    @Id
    @GeneratedValue
    private Integer id;

    @OneToOne(mappedBy = "student_id")
    private Student student;

    @ManyToOne(targetEntity = MyClass.class,
               mappedBy = "students")
    private MyClass myClass;
}