我有三个表来保存学生信息,第二个表保存课程信息。第三是关联学生和班级学生班级表
实体和关系如下:
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 :(得分: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 - 我还建议用课程重命名课程:)