首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate双向映射不起作用

Hibernate双向映射不起作用
EN

Stack Overflow用户
提问于 2016-10-15 14:51:34
回答 1查看 367关注 0票数 0

我有两个表的两个实体。学生与MonthAttendance有一对多的关系。student_id是join列。请看下面的代码。

代码语言:javascript
运行
复制
@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类从数据库中获取学生数据。我使用下面的代码来获取数据,

代码语言:javascript
运行
复制
List<Student> studentList = session.createQuery("from Student").list();
List<Student> studentList = session.createQuery("from MonthAttendance").list();

两者都工作得很好。但是这个对象有一个递归结构,像学生有MonthAttendance,MonthAttendance有学生,学生有MonthAttendance等。有没有办法解决这个问题?我只需要一个学生有MonthAttendance,其中没有学生,如果我试图得到学生。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-10-17 04:45:11

为了摆脱这种递归行为,只需删除:

代码语言:javascript
运行
复制
cascade = CascadeType.ALL

来自学生实体,如下所示:

代码语言:javascript
运行
复制
@OneToMany(mappedBy = "student")
private Set<MonthAttendance> monthAttendances;

Cascade基本上是这样说的:

如果我在一个实体上执行一个操作,我应该如何操作关联的实体。

我应该对它执行相同的操作吗?

让我们以你的例子为例:

如果我尝试保存/持久化一个MonthAttendance对象,Hibernate也会尝试在与其相关的Student对象上执行保存/持久化操作。为什么?

因为在Student关联下的MonthAttendance实体上,我们有CascadeType.ALL (在CascadeType.ALL下,我们有4到5种操作),这意味着每当您尝试保存/持久化MonthAttendance时,Hibernate都会尝试在附加的Student对象上执行相同的操作(在我们的例子中是保存/持久化)。

这就解释了为什么会出现这种递归行为,因为您使用标记了关联的两端:

代码语言:javascript
运行
复制
cascade = CascadeType.ALL

当您保存第一个实体时,它会尝试保存第二个实体,第二个实体会再次尝试保存第一个实体,依此类推。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40055972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档