0

我有一个 A 类与 B 类具有 OneToMany 关系的情况。B 类只包含一些属性,如 id、firstName 和 lastName。id 是通过 UUID 生成的。因为很可能 A 的很多实例将引用具有相同 firstName 和 lastName 值的 B 实例,加上 B 实例中的这些值不太可能永远改变。因此,如果其他参数相同,我决定避免重复并让 A 的实例引用到 B 的相同实例(在数据库中)。

例子:

b: "John Doe"
a: a1 ("Foo Bar", "John Doe"), a2 ("John Doe", "Alan Smith").

为了实现这一点,如果将新的 B 添加到 A 中,我总是检查数据库中是否存在具有相同参数的记录。如果是这样,我将用数据库中的那个覆盖 B 实例的 id 并添加之后交给A。

现在我的问题来了。一切正常,但如果我坚持一个 A,我手动更改了 B 的 ID,使其具有与数据库中已经存在的 B 相同的 ID,我将得到一个异常:

Caused by: org.hibernate.exception.ConstraintViolationException:
Duplicate entry '2cfa1412-5f64-4a9c-b55c-f7db1148bef9' for key 'PRIMARY'

所以我的问题是:

  • 如何在不忽略异常的情况下解决此问题?
  • 这是满足我需要的好方法吗?

最好的祝福

4

1 回答 1

1

首先,您没有OneToMany,而是ManyToMany。

现在,要解决您的问题,不要将附加 B 的 ID 分配给您的 detachedB,而是用附加的 B 替换分离的 B:

Set<B> bs = new HashSet<B>(a.getBs()); // copy the list of Bs
a.getBs().clear();
for (B b : bs) {
    B existingB = searchBWithSameValuesAs(b);
    if (existingB != null) {
        a.getBs().add(existingB);
    }
    else {
        em.persist(b);
        a.getBs().add(b);
    }
}
于 2012-05-06T06:37:39.947 回答