【问题标题】:Panache: Insert or ignore child华丽:插入或忽略孩子
【发布时间】:2021-08-17 17:17:32
【问题描述】:

我想保留一个与子实体具有@OneToMany 关系的实体。我正在使用 Quarkus 1.13.1 和 Quarkus Panache。

例子


public class User {

    private List<Item> items;

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


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

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

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

【问题讨论】:

    标签: quarkus quarkus-panache


    【解决方案1】:

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

    了解哪些对象是托管的,哪些不是托管的,并区分哪些对象是新创建的持久对象,而不是仅仅代表数据库中的现有对象,这一点非常重要。

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

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

    我建议明确实施检查,以便您完全控制策略。将Item 设为缓存实体可能是个好主意,这样您就可以实现安全验证而不会降低性能。

    【讨论】:

    • 非常感谢。这支持了我的理解。只是想确保我不会错过一些可以节省代码的简洁新快捷方式。
    猜你喜欢
    • 2018-08-28
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    相关资源
    最近更新 更多