![](/img/trans.png)
[英]@OnDelete(CASCADE) not working on bidirectional mapping (hibernate)
[英]Hibernate Bidirectional mapping is not working
我有两个表的两个实体。 学生与MonthAttendance有一对多的关系。 student_id是加入列。 请看下面的代码。
@Entity
@Table(name="student")
public class Student implements Serializable {
@Id
@Column(name="student_id")
@GeneratedValue(strategy= GenerationType.AUTO)
private String studentId;
/*
*More codes
*/
@OneToMany(mappedBy = "student", cascade = CascadeType.ALL)
private Set<MonthAttendance> monthAttendances;
/*
*mutators
*getter and setter methods
*/
}
@Entity
@Table(name="month_attendance")
public class MonthAttendance implements Serializable {
@Id
@Column(name="month_year_id")
@GeneratedValue(strategy= GenerationType.AUTO)
private String monthYearId;
/*
*More codes
*/
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "student_id")
private Student student;
/*
*mutators
*getter and setter methods
*/
}
我有DAO课,可以从数据库中获取学生数据。 我使用下面的代码来获取数据,
List<Student> studentList = session.createQuery("from Student").list();
List<Student> studentList = session.createQuery("from MonthAttendance").list();
两者都工作正常。 但是对象具有递归结构,如Student具有MonthAttendance,MonthAttendance具有Student,再次Student具有MonthAttendance并继续。 有什么办法可以解决这个问题? 我只需要一个学生有MonthAttendance,而我却没有学生,如果我想获得Student。 提前致谢。
为了摆脱这种递归行为,只需删除:
cascade = CascadeType.ALL
来自学生实体,例如:
@OneToMany(mappedBy = "student")
private Set<MonthAttendance> monthAttendances;
级联基本上告诉了这一点:
如果我对实体执行操作,那么我应该如何对关联实体执行操作。
我应该对它执行相同的操作吗?
让我们举个例子:
如果我尝试保存/持久化一个MonthAttendance
对象,则Hibernate还将尝试对与此对象相关的Student
对象进行保存/持久化操作。 为什么?
因为在Student
协会下的MonthAttendance
实体上,我们有CascadeType.ALL(在CascadeType.ALL下,我们有4到5种动作),这意味着每当您尝试保存/保持MonthAttendance
Hibernate都会尝试执行相同的动作(保存/持久保持在我们的附案例) Student
对象。
这就解释了为什么您会出现这种递归行为,因为您在关联的两面都标记了:
cascade = CascadeType.ALL
当您保存第一个实体时,它将尝试保存第二个,然后第二个尝试再次保存第一个,依此类推。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.