提问者:小点点

华丽:插入或忽略孩子


我想持久化一个与子实体具有@OneTo多关系的实体。我正在使用QUKUS 1.13.1和QUKUS Panache。

例子


public class User {

    private List<Item> items;

    @OneToMany(cascade = CascadeType.ALL)
    public List<Item> getItems()...
}


如果我想使用item表中已经存在的一些项目来持久化用户(user.可持续()),那么我当然会得到一个“重复键”异常。到目前为止一切顺利。

但是我想知道如果表项目中已经存在项目,是否有一种下降方式可以跳过/忽略插入。

当然,我可以查询数据库以检查子值是否存在,但这似乎有些乏味,并且通过数据检查使代码膨胀,所以我想知道是否有一些注释或其他快捷方式来处理此问题。


共1个答案

匿名用户

应专门使用持久操作在数据库中创建(存储)新对象,并使Hibernate管理Java对象,直到Session关闭。

非常重要的是,您要知道哪些对象是被管理的,哪些不是,并区分哪些是新创建的持久化对象,而不仅仅是表示数据库中的现有对象。

为此,最好先加载现有的Item;如果您确定哪些已经存在于DB您可以使用惰性代理来表示它们,并在持久化用户之前将它们放入列表中。

如果你不知道数据库中已经存在哪些Item,那么你确实应该先查询数据库。这个操作没有捷径;我想我们可以探索一些改进,但通常自动化这样的事情很棘手。

我建议显式地实施检查,这样您就可以完全控制策略。将Item设为缓存实体可能是个好主意,这样您就可以在没有性能缺陷的情况下实现安全验证。