如何在插入包含对象集的对象列表期间忽略唯一违规

Posted

技术标签:

【中文标题】如何在插入包含对象集的对象列表期间忽略唯一违规【英文标题】: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。我保存了父母列表,其中每个父母都包含一组孩子。子表具有唯一约束。如果发生约束冲突,我想忽略它并忽略(不持久)违反约束的孩子,但我想插入每个不违反约束的孩子。该怎么做?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

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

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

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

    从父级中删除子级。

    转到 1。

【讨论】:

以上是关于如何在插入包含对象集的对象列表期间忽略唯一违规的主要内容,如果未能解决你的问题,请参考以下文章

如何创建唯一索引

如何在 MFC 的 CListCtrl 中插入位图或其他图像对象?

测试期间的Spring Boot JPA事务 - 不会在插入时抛出密钥违例异常

JAXB:如何在解组 XML 文档期间忽略命名空间?

如何使用相同的SqlConnection对象在多个SqlCommands中声明和使用T-SQL变量来执行多个插入?

如何使用 LINQ 从对象列表中获取唯一的属性列表?