spring-data-jpa 如何在插入包含对象集的对象列表时忽略唯一冲突

unhi4e5o  于 2022-11-10  发布在  Spring
关注(0)|答案(3)|浏览(295)

我使用PostgreSQL和Spring Data JPA与Hibernate。我有一对多关系与orphanRemoval =假,因为我经常添加许多查尔兹的关系。
父项:
@OneToMany(mappedBy =“父代”,级联= {级联类型.ALL },orphanRemoval = false,获取=获取类型.LAZY)公共集合getChildren(){返回孩子;}
子项:
@ManyToOne @JoinColumn(名称=“父标识”)public父项getParent(){返回父项;}
要持久化或合并对象,我使用方法
可迭代< T >保存(可迭代实体)
我保存父表的列表,其中每个父表都包含一组子表。子表有唯一的约束。如果发生约束冲突,我想忽略它并忽略(不持久化)有约束冲突的子表,但我想插入每个没有约束冲突的子表。怎么做?

f1tvaqid

f1tvaqid1#

通过异常处理此脏事件。
1.尝试更新数据库,如果在此处发生错误。捕获UniqueViolationException并找到JDBCException。向上转换到限定的数据库异常并找到损坏的子异常。
1.从父项中删除子项。
1.转到1。

vsnjm48y

vsnjm48y2#

最简单的方法是过滤那些会产生唯一违规异常的实体。过滤完实体后,可以保存好的实体。
应使用异常,因为它们实际上是:例外情况。

zz2j4svz

zz2j4svz3#

这是一个Postgress特定的答案,并不是很符合犹太教教规,但您可以对不同的DB采用类似的方法:
利用原生Postgres insert语句中的on conflict子句。这样,您就完全不必处理唯一约束异常,DB将在遇到冲突时为您解决冲突。
1.准备本机SQL插入语句,例如insert into child (id, parent_id, data) values (:id, :parent_id, :data) on conflict do nothing
1.将前面编写的语句与javax.persistence.EntityManager#createNativeQuery(java.lang.String)一起使用

EntityManager.createNativeQuery(sql)
                .setParameter("id", it.id)
                .setParameter("parent_id", parentId)
                .setParameter("data", it.data)
                .executeUpdate()

1.对所有子项重复此步骤

相关问题