【发布时间】:2017-01-23 09:28:21
【问题描述】:
我遇到了一个奇怪的问题:我有一个实体和该类的侦听器,
@Entity
@EntityListeners(Listener.class)
public class Foo {
@Id long id;
@ElementCollection Map<String, String> map;
// getters and setters
}
public class Listener {
@PreUpdate
@PrePersist
public void preUpdate(Foo foo) {
System.out.println(foo);
System.out.println(foo.getMap().size());
}
}
@Stateless
public class TestDAO {
@PersistenceContext
EntityManager em;
public void testMerge(Foo foo) {
foo.getMap().put("foo", "test");
System.out.println(foo);
System.out.println(foo.getMap().size());
this.em.merge(foo);
}
}
然后当我执行testMerge 时,我得到这个输出(更新 带有 SQL 调试):
Foo@15bcfa3c
1
Foo@671144f9
0
Hibernate: insert into Foo values ( )
Hibernate: insert into Foo_map (Foo_id, map_KEY, map) values (?, ?, ?) // 1, 'foo', 'test'
所以地图可以正确保存在数据库中,但传递给侦听器的实体有一个空地图。发生了什么?
更新:Jira 问题和测试用例 相关 Jira 问题:https://hibernate.atlassian.net/browse/HHH-11414 和测试用例:https://github.com/heruan/hibernate-testcase/tree/HHH-11414
【问题讨论】:
-
Foo 是一个新实体还是之前已经保存过?
-
在我运行的测试中,它是一个新实体;我使用
merge,因为在实际场景中它可能是新的或现有的。 -
您知道作为参数提供给 merge 的实例仍然是一个非托管实体,并且该合并返回一个托管实体。所以你在
testMerge中打印的实例永远不会与监听器中的实例相同! -
我知道@KlausGroenbaek,我在问为什么监听器中的合并实例有一个空地图。
标签: hibernate jpa entitylisteners