JPA:表关联关系中的级联

时间:2014-07-11 14:31:02

标签: java hibernate 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是不是得救了?如果答案是课堂,学生没有直接相关,那么当我尝试取学生时,如何检索所有课程

3 个答案:

答案 0 :(得分: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?

答案 1 :(得分:0)

您使用的级联映射可以正常使用JPA EntityManager操作persist()merge()。但是,您似乎正在使用Hibernate会话来保存对象。使用此方法,您还需要为@Cascade(CascadeType.SAVE_UPDATE)字段添加Hibernate特定注释class

答案 2 :(得分:0)

您不需要创建一个名为StudentClass的独立实体。您可以使用@JoinTable让它为您创建。这将处理您不自行更新值的情况。

删除课程 并添加

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

另外,替代方法是更新Student表以包含Class信息,以便表格看起来像 - 1.表格 - 学生(StudentId,StudentName,ClassId) 2.表 - 类(ClassId,ClassName)

PS - 我还建议用课程重命名课程:)