2014-05-14 64 views
0

我的要求是有每個班級的班級和學生名單。每個學生必須在零或最多一個班級。我的代碼如下,但在數據庫中,每個學生可以在許多課程中。如何讓每個學生都只有一個班,只有一個班?如何強制零對一的關係?

學生項目表如下

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

在你的學生課堂中有一個「classId」字段。如果該字段爲空,則學生在0級。如果他在一個班上,只要把班級ID放在那個領域,你就完成了......它的設計方式確實更適合一對多的關係(我從來沒有在關係中談論過0, '0'沒有關係)... –

+2

不,不要存儲其他實體的ID。使用關聯。你的映射很好。如果你想確保一個學生最多隻有一個班級,那麼你應該對'StudentItem.student_id'有一個唯一的約束。 –

回答

0

在我看來,它的MyClass之間的多到一的關係StudentItem,與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; 
}