我想持久化一个与子实体具有@OneTo多
关系的实体。我正在使用QUKUS 1.13.1和QUKUS Panache。
例子
public class User {
private List<Item> items;
@OneToMany(cascade = CascadeType.ALL)
public List<Item> getItems()...
}
如果我想使用item
表中已经存在的一些项目来持久化用户(user.可持续()
),那么我当然会得到一个“重复键”异常。到目前为止一切顺利。
但是我想知道如果表项目
中已经存在项目
,是否有一种下降方式可以跳过/忽略插入。
当然,我可以查询数据库以检查子值是否存在,但这似乎有些乏味,并且通过数据检查使代码膨胀,所以我想知道是否有一些注释或其他快捷方式来处理此问题。
应专门使用持久
操作在数据库中创建(存储)新对象,并使Hibernate管理Java对象,直到Session关闭。
非常重要的是,您要知道哪些对象是被管理的,哪些不是,并区分哪些是新创建的持久化对象,而不仅仅是表示数据库中的现有对象。
为此,最好先加载现有的Item
;如果您确定哪些已经存在于DB您可以使用惰性代理来表示它们,并在持久化用户之前将它们放入列表中。
如果你不知道数据库中已经存在哪些Item
,那么你确实应该先查询数据库。这个操作没有捷径;我想我们可以探索一些改进,但通常自动化这样的事情很棘手。
我建议显式地实施检查,这样您就可以完全控制策略。将Item
设为缓存实体可能是个好主意,这样您就可以在没有性能缺陷的情况下实现安全验证。