我有两个表的两个实体。学生与MonthAttendance有一对多的关系。student_id是join列。请看下面的代码。
@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();两者都工作得很好。但是这个对象有一个递归结构,像学生有MonthAttendance,MonthAttendance有学生,学生有MonthAttendance等。有没有办法解决这个问题?我只需要一个学生有MonthAttendance,其中没有学生,如果我试图得到学生。提前谢谢。
发布于 2016-10-17 04:45:11
为了摆脱这种递归行为,只需删除:
cascade = CascadeType.ALL来自学生实体,如下所示:
@OneToMany(mappedBy = "student")
private Set<MonthAttendance> monthAttendances;Cascade基本上是这样说的:
如果我在一个实体上执行一个操作,我应该如何操作关联的实体。
我应该对它执行相同的操作吗?
让我们以你的例子为例:
如果我尝试保存/持久化一个MonthAttendance对象,Hibernate也会尝试在与其相关的Student对象上执行保存/持久化操作。为什么?
因为在Student关联下的MonthAttendance实体上,我们有CascadeType.ALL (在CascadeType.ALL下,我们有4到5种操作),这意味着每当您尝试保存/持久化MonthAttendance时,Hibernate都会尝试在附加的Student对象上执行相同的操作(在我们的例子中是保存/持久化)。
这就解释了为什么会出现这种递归行为,因为您使用标记了关联的两端:
cascade = CascadeType.ALL当您保存第一个实体时,它会尝试保存第二个实体,第二个实体会再次尝试保存第一个实体,依此类推。
https://stackoverflow.com/questions/40055972
复制相似问题