hibernate@manytomany关系上的唯一约束冲突

kqhtkvqz  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(404)

我的数据库中有3个实体,我们称它们为 A , B ,和 C . A 以及 B 彼此共享多对多关系。 A 有一个 SortedSetB s、 但是 B 不引用 A (未配置集合或w/e)。所以我们有以下几点。

// Inside class A
@ManyToMany
@JoinTable(name = "a_b", 
           joinColumns = {@JoinColumn(name = "a_id")}, 
           inverseJoinColumns = {@JoinColumn(name = "b_id")})
@LazyCollection(LazyCollectionOption.FALSE)
@SortNatural
private SortedSet<B> bSet = new TreeSet<B>();
``` `B` 以及 `C` 彼此之间有一对多的关系(1) `B` 对很多人来说 `C` s) 是的。 `C` 有一个 `B` 在它的实体中,但是 `B` 没有提到它的很多 `C` 实体。所以我们有以下几点

// Inside class C
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "b_id", nullable = false, updatable = true)
protected B b;

我们有一个同步进程,每夜运行一个作业来更新 `A` 实体及其与 `B` 实体(不经常更改)。我们最终得到了类似于以下的东西(实际上,DAO、服务等要复杂得多)。

// Get the A value to be updated
A aToUpdate = entityManager.find(A.class, idForA);

// Out of scope of the question, but we need to figure out B via a string field on C
C cValue = myDao.getByProperty("fieldName", fieldValue);

// Determine the B values to set on aToUpdate
B bToSetOnA = cValue.getB();
TreeSet bSet = new TreeSet<>();
bSet.add(bToSetOnA);

// Update aToUpdate
aToUpdate.setBSet(bSet);
aToUpdate = entityManager.merge(aToUpdate);
entityManager.flush();

发生这种情况时,会发生以下错误。

ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (Sync Thread)
Duplicate entry 'myAId-almostMyBId' for key 'uk_a_b'

有趣的是 `almostMyBId` 离实际值少1个字符吗 `B` 但只有完整的id出现在a\U b表中。
当我浏览代码库时,有一个 `uk_a_b` 表上索引的约束。这是利基巴斯的。
zsohkypk

zsohkypk1#

这是非常具体的我的情况,但我想我会张贴的答案无论如何,以防有人阅读我的问题,并一直在努力。
我团队中的另一个开发人员负责加速基于 a 以及 a_b table。为了避免执行join和where子句,开发人员将数据从 a_b (使用where子句)并添加触发器,以便在更新内容时,它将插入新表。这个新表有一个与 a_b 表(即, uk_a_b ). 重复的案例未正确处理,因此引发了一个错误。由于名字的相似性,它似乎是 a_b 表引发问题时,它实际上是新表。快乐时光。

相关问题