【发布时间】:2017-07-12 11:45:53
【问题描述】:
问题
在合并我的一个 Hibernate 实体时,我观察到违反约束。有两个表 A 和 B,其中一个保存元数据,另一个是 String 值的映射。
在表 B 中,(id, key) 上有一个组合主键。
现在,当我合并 A 的现有实例(B 也有多个条目)时,Hibernate 将为 B 执行 UPDATE 和 INSERT 语句。
UPDATE 语句没有问题,但是 INSERT 语句不能执行,因为它会导致违反约束,因为 (id, key) 是唯一的组合。
我发现只有当 B 中的现有值为 null 时才会出现此问题。
我使用的是 Oracle 11、JPA 2.1 和 EJB 3.2。不过,不完全确定如何确定 Hibernate 版本。
一个例子
假设这些是表 B 的条目:
23, fooKey, foo
23, barKey, bar
23, errorKey, null
现在,当我合并 A (id = 23) 时,将为 fooKey 和 barKey 执行 UPDATE 语句。然而,对于errorKey,Hibernate 将改为发出 INSERT 语句并导致违反约束。
所以我的问题是:
- 当现有值为
null时,为什么 Hibernate 会执行 INSERT 语句? - 如何解决此问题?
我的数据库
表 A( id、版本、lastUpdate )
表 B( id、key、value )
我的实体
@Entity
public class A {
@Id
public long id;
public long version = 0;
public Date lastUpdate = new Date();
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "B", joinColumns = @JoinColumn(name = "ID"))
@MapKeyColumn(name = "KEY")
@Column(name = "VALUE", length = 2000)
public Map<String, String> myMapping = new HashMap<String, String>();
// Setters and getters...
}
【问题讨论】:
-
能否提供实际的select和merge操作以及map修改语句?
-
基本上,我所做的只是
A a = em.find(A.class, 23); a.myMapping.put("errorKey", null); em.merge(a);虽然,在我的应用程序的上下文中它有点复杂。