gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:45:06 25 4
gpt4 key购买 nike

我相信这是一个常见的场景。假设我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com