我有两个表的两个实体。学生与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,如果我试图让学生,那就没有学生。在此先感谢。
答案 0 :(得分:0)
为了摆脱这种递归行为,只需删除:
cascade = CascadeType.ALL
来自Student实体,如下所示:
@OneToMany(mappedBy = "student")
private Set<MonthAttendance> monthAttendances;
Cascade基本上说明了这一点:
如果我对某个实体执行某项操作,我该如何对相关实体采取行动。
我应该对它执行相同的操作吗?
我们举个例子:
如果我尝试保存/持久化MonthAttendance
对象,Hibernate也会尝试对与其相关的Student
对象执行保存/持久操作。为什么?
因为MonthAttendance
关联下的Student
实体,我们有CascadeType.ALL(在CascadeType.ALL下我们有4到5种操作),这意味着每当你尝试保存/持久{{ 1}} Hibernate尝试在附加的MonthAttendance
对象上执行相同的操作(在我们的例子中保存/保留)。
这解释了为什么你得到这种递归行为,因为你用以下方式标记了关联的两面:
Student
当您保存第一个实体时,它会尝试保存第二个实体,第二个实体再次尝试保存第一个实体,依此类推。