2014-07-11 259 views
0

我有三個表格來存放學生信息,第二個存放班級信息。三是對學生和班級studentclass表進行關聯JPA:在表關聯關係中級聯

的實體和關係給出如下

class Student 
{ 
@Id 
@Column(name="STUDENT_ID") 
long studentId; 
@OneToMany(cascade=CascadeType.ALL,mappedBy="student") 
Set<StudentClass> studentClasses 
} 

class Class 
{ 
@Id 
@Column(name="CLASS_ID") 
long classId; 

@OneToMany(cascade=CascadeType.ALL,mappedBy="class") 
Set<StudentClass> studentClasses 
}  

class StudentClass 
{ 
@Id 
@Column(name="STUDENT_CLASS_ID") 
long studentClassid; 

@ManyToOne 
@JoinColumn(name="STUDENT_ID") 
private Student student; 

@ManyToOne(cascade=CascadeType.ALL) 
@JoinColumn(name="CLASS_ID") 
private Class class; 
} 

class persist{ 
public void persist(){ 
Student student1 = new Student(); 
Class class1 = new Class(); 

session.save(class1);  

StudentClass studentClass = new StudentClass(); 
studentClass.setClass(class1); 
studentClass.setStudent(student1); 
student1.getStudentClasses().add(studentClass); 
session.save(student1);  
session.getTransaction().commit(); 
} 
} 

以上持久性邏輯正常工作,因爲我救單獨的Class1,最後學生課。但是如果我試圖單獨保存student1,那麼class1並沒有得到保存?如果答案是課堂,學生不直接相關,那麼當我嘗試獲取學生時,如何獲取所有課程

回答

0

首先,我認爲您需要使用@Entity註釋您的實體類。 由於你的實體StudentClass沒有任何屬性來證明你已經編碼過,所以只能使用@ManyToMany來映射你的實體Student和Class,如下所示:http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany 如果你需要檢索獲取所有類的時候獲取一個學生設置屬性爲FetchType到FetchType.EAGER需要更多Difference between FetchType LAZY and EAGER in Java Persistence API?

0

您使用的級聯映射可以正常使用JPA EntityManager操作persist()merge()。不過,它看起來像使用Hibernate會話來保存對象。使用這種方法,您還需要爲class字段添加Hibernate特定註釋@Cascade(CascadeType.SAVE_UPDATE)

0

你不需要創建一個名爲StudentClass的獨立實體。你可以使用@JoinTable讓它爲你創建。這將處理你自己不更新值的情況。

卸下類 並添加

@OneToMany(mappedBy = "Student") 
@JoinTable(name = "StudentClass", joinColumns = @JoinColumn(name = "StudentId"), 
    inverseJoinColumns = @JoinColumn(name = "ClassId")) 
private Collection<Class> classes; 
} 

此外,另一種方法,是更新學生表以包括所述類的信息,使得這些表看起來像 - 1中。表 - 學生(StudentId,StudentName ,ClassId) 2.表 - Class(ClassId,ClassName)

PS - 我也建議重命名Class with Course :)