【问题标题】:How to ignore unique violation during insert list of objects which contain set of object如何在插入包含对象集的对象列表期间忽略唯一违规
【发布时间】:2012-09-10 05:26:08
【问题描述】:

我将 PostgreSQL 和 Spring 数据 JPA 与 Hibernate 一起使用。我与 orphanRemoval = false 有关系 OneToMany 因为我经常将许多孩子添加到关系中。

家长:

@OneToMany(mappedBy = "parent", cascade = { CascadeType.ALL }, orphanRemoval = false, fetch = FetchType.LAZY) 公共设置 getChildren() { 归还孩子; }

孩子:

@ManyToOne @JoinColumn(name = "parent_id") 公共父 getParent() { 返回父母; }

要持久化或合并对象,我使用方法

Iterable 保存(Iterable 实体)

形成 CrudRepository。我保存了父母列表,其中每个父母都包含一组孩子。子表具有唯一约束。如果发生约束冲突,我想忽略它并忽略(不持久)违反约束的孩子,但我想插入每个不违反约束的孩子。该怎么做?

【问题讨论】:

    标签: java hibernate postgresql-9.1 spring-data-jpa


    【解决方案1】:

    干净的方法是过滤会产生唯一违规异常的实体。 过滤掉这些实体后,您可以保存好的实体。

    应按实际情况使用异常:异常。

    【讨论】:

    • 我同意你的观点,但在这个场景中,我必须在插入之前从数据库中选择所有孩子。它导致更多的操作要做。我专门将 orphanRemoval 设置为 false 以避免它。我是 ORM 的初学者,我注意到如果你不关心操作的数量和复杂性,那么 ORM 很容易使用。但是如果你想减少不必要的操作,就会出现问题。
    • "如果你不关心操作的数量,那么 xxx 很容易使用。",xxx 可以是任何抽象:jni、ajax、sql、http、队列、时事通讯、钓鱼、战斗、迷宫-清除 ;)
    • 这不是一个干净的方法,因为有人可能会在另一个事务中添加新实体,你可能会得到唯一的违规异常。
    • @mpr 你的意思是唯一的约束违反异常。这就是为什么我们在 ACID 中有 I。但你是对的:延迟约束和脏读可以构造这样的违反 ACID 的行为。
    • 我没有写任何关于脏读和延迟约束的文章。在您描述的“读取提交”事务隔离级别方法中也不起作用。
    【解决方案2】:

    通过异常处理这个脏东西。

    1. 尝试更新数据库,如果可以,请在此处中断。 捕获 UniqueViolationException 并找到 JDBCException。 Upcast 到您的合格数据库异常并找到损坏的 Children。

    2. 从父级中删除子级。

    3. 转到 1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 2018-02-12
      • 2014-02-17
      相关资源
      最近更新 更多