【发布时间】:2011-12-14 23:19:55
【问题描述】:
我有一个异步注释方法,它通过方法参数接收实体。在这种方法中,我尝试设置一个变量 3 次:
@Inject EntityDao entityDao;
@Asynchronous
public Future<String> doSomething (MyEntity p_myEntity) {
MyEntity myEntity = entityDao.merge(p_myEntity); // change from detached to attached
// em.contains(myEntity) returns true
myEntity.setName("Joe 1"); // newer set in database
// A System.out.println(myEntity.getName()) does say "Joe 1"
try {
Thread.sleep(20*1000);
} catch () ...etc
myEntity.setName("Joe 2"); // newer set in database
// A System.out.println(myEntity.getName()) does say "Joe 2"
try {
Thread.sleep(20*1000);
} catch () ...etc
myEntity.setName("Joe 3"); // only one set in database
return new AsyncResult<>("done");
}
编辑:多亏了 PedroKowalski,我对问题有了更好的理解,我会重新表述。
在执行上述方法的过程中,我有两种方法可以检查 myEntity.setName() 是否真的改变了:
- 在 sleep() 期间,如果名称值发生更改,我会检查数据库
- 在网页上显示 MyEntity 对象列表(带有名称),此列表每 2 秒更新一次。
上述两种方法都表明数据库中的值“Joe 1”和“Joe 2”较新。只有在 doSomething() 方法完成后,才会将姓氏集 (Joe 3) 放入数据库中。
所以我的问题是:为什么没有将值“Joe 1”和“Joe 2”放入数据库中,而只将最后一个值放入数据库中?
【问题讨论】:
-
这是同一事务的另一种方法吗?您是否尝试在合并发生后显式刷新 EM?
-
不,不是同一笔交易。您的意思是在 EntityDao 中的 merge() 之后每次都刷新?
-
“我正在调用 myEntity.getName() 方法”是什么意思。这是您传递给“doSomething”方法的同一个实例,还是使用 EntityManager#findById(-) 查找的 MyEntity 的实例?
-
不,在控制器类的其他地方,我通过调用 entityDao.findAll() 检索所有 myEntities,并将它们显示在网页上。这是每 5 秒完成一次。说清楚:异步方法和控制器没有任何关系
-
您可以设置您想要的所有值并在方法结束时合并。您还可以在方法的开头合并并在它之后设置您想要的所有值(在从 merge() 实例返回的对象实例上)。不过没关系,您至少需要调用一次合并操作,因为您在此方法中对分离的实体进行操作。
标签: jpa asynchronous merge entity