Panache:插入或忽略 child

Panache: Insert or ignore child

我想保留一个与 child 实体具有 @OneToMany 关系的实体。我将 Quarkus 1.13.1 与 Quarkus Panache 一起使用。

示例


public class User {

    private List<Item> items;

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


如果我想让用户 (user.persist()) 保留 item table 中已经存在的一些项目,那么我当然会遇到“重复键”异常.到目前为止一切顺利。

但我想知道如果 table items.

中已经存在 item 是否有下降的方式来 skip/ignore 插入

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

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

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

为此,确实先加载现有的Item会更好;如果您确定数据库中已经存在哪些,您可以使用惰性代理来表示它们并将它们放入列表中,然后再保留用户。

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

我建议明确实施检查,以便您可以完全控制该策略。将 Item 设为缓存实体可能是个好主意,这样您就可以在不影响性能的情况下实施安全验证。