2014-07-11 170 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 :)