hibernate - 一对多 hibernate 的最佳实践是什么

标签 hibernate one-to-many cascade

我相信这是一个常见的场景。假设我在 hibernate 中有一个一对多的映射:Category有很多Items
类别:

@OneToMany(
    cascade = {CascadeType.ALL},fetch = FetchType.LAZY)
@JoinColumn(name="category_id")
@Cascade(
    value = org.hibernate.annotations.CascadeType.DELETE_ORPHAN
)
private List<Item> items;

元素:
@ManyToOne(targetEntity=Category.class,fetch=FetchType.EAGER)
@JoinColumn(name="category_id",insertable=false,updatable=false)
private Category category;

一切正常。我用 Category完全控制Item的生命周期。但是,当我编写代码来更新时 Category , 首先我得到 Category从数据库出来。然后将其传递给 UI。用户为 Category 填写更改的值并传回去。问题来了:因为我只传递Category信息,而不是 Items , Items因此集合将为空。当我打电话时saveOrUpdate ,它将清除所有关联。

关于什么是最好的解决这个问题的任何建议?我认为拥有 Category 的优势控制Items是轻松掌握Items的顺序并且不要直接混淆。

但是如果您确实只想更新 Category 的情况呢?本身?先加载然后合并?

最佳答案

对于您的问题,如果我们在没有深入代码的情况下从高层查看,我认为问题不在于 hibernate 配置,而在于您处理实体的方式。我建议您通过以下方式修改处理实体的方式,

1) 在将 Category 对象传递给 UI 之前,您没有提到如何获取它。因此,如果您使用 get load 方法简单地获取类别对象,那么您可以简单地创建单独的初始化方法,该方法可以通过简单地调用 getter 方法来加载项目集合。通过 getter 方法延迟加载的项目集合将被填充,然后您可以将其传递给 UI。用户只需修改类别,项目将保持原样。然后您可以保存该实体,因此项目将保持原样。

2) 如果您不想在传递到 UI 之前加载项目集合,那么您可以在不加载项目集合的情况下获取类别对象。将其传递给 UI。一旦用户修改并传回它,而不是直接保存它,我建议您首先获取该 category_id 的最新类别对象并通过调用 getter 加载其项目,然后将更改后的值从 UI 返回的类别填充到这个最新获取的类别中。现在您可以保存此合并对象,以便您的项目集合是安全的。

关于hibernate - 一对多 hibernate 的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2870995/

相关文章:

java - Hibernate - 无法从表中读取值

java - 有什么方法可以使 hibernate 查询自动返回键值映射(省略 "as")?

java - 检查 hibernate JPA 中生成的代理类

jpa - JPA2.0 : Delete Entity in OneToMany RelationShip

java - Hibernate:在级联删除项目时清理集合的二级缓存

Postgresql - 确定从级联删除中删除了哪些记录

SQL Server - 使用递归外键进行级联 DELETE

java - 我应该或者可以在 EJB 中使用 Spring

MySQL一对多选择

java - Hibernate (JPA) 多个@OneToMany 用于同一模型