我使用GAE、JPA和Spring 得到以下错误
id为"的对象由不同的对象管理器管理
当我第一次创建帐户时,我将User对象放在会话中。然后,当我在初始会话期间更新用户配置文件时,我会合并分离的用户。一切都很好。
然后我注销,然后创建一个新会话。这一次,我加载User对象并将其放置到会话中。仍然可以,但问题是当我更新用户配置文件时,合并失败并出现上述错误。
public boolean loadProfile(String openId, String email) {
User user = null;
try {
user = userDao.findByOpenId(openId);
} catch (NoResultException e) {
}
if (user != null) {
logger.error(JDOHelper.getPersistenceManager(user));
getSessionBean().setUser(user);
return true;
} else {
user = createNewAccount(openId, email);
getSessionBean().setUser(user);
return false;
}
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
private User createNewAccount(String openId, String email) {
User user = new User();
user.setDisplayName(Long.toString(System.currentTimeMillis()));
OpenIdentifier oid = new OpenIdentifier();
oid.setOpenId(openId);
oid.setEmail(email);
oid.setUser(user);
Set<OpenIdentifier> openIds = new HashSet<OpenIdentifier>();
openIds.add(oid);
user.setOpenIds(openIds);
user = userDao.merge(user);
return user;
}
@Transactional(propagation=Propagation.REQUIRED)
public void createOrUpdate(ActionEvent e) {
logger.error(JDOHelper.getPersistenceManager(userFacade.getDelegate()));
User user = userDao.merge(userFacade.getDelegate());
sessionBean.setUser(user);
}
我发现了这些相关的问题,但我仍然无法解决。
- AppEngine数据存储:";id为的对象。。。由不同的对象管理器"管理
- 谷歌应用引擎-id为"的对象"由另一个JPA管理
- Datanucleus:从@Transactional转向非Transactional
- http://www.atentia.net/2010/03/object-with-id-is-managed-by-a-different-object-manager/
WRT关闭PM(根据1&2),我不能显式关闭PM,因为我使用的是Springorg.springframework.org.jpa.support.OpenEntityManagerInViewFilter。从日志来看,它似乎在打开和关闭每个页面请求。
WRT使实体可分离(根据3和4),首先,我使用的是JPA,使用与JDO相关的注释似乎是错误的。其次,当我尝试时,它没有起作用。
为了获得额外的积分,您如何使用JDOHelper.getPersistenceManager(obj)进行调试?在这种情况下,我得到了null,因为用户在页面请求之间是分离的。这对我来说似乎很正常,所以我不清楚如何使用它进行调试。
- 你没有PM,你有EM。不知道你指的是什么
- 可拆卸:使用JPA,所有类都可以(增强为)拆卸
- 你在那里使用了一些古老的GAE JPA插件(v1.x?),它使用了不受支持的旧版本的DataNucleus。使用GAE JPA v2.x。"ObjectManager"在DataNucleus中已经存在多年了
- 你(或你正在使用的软件)必须关闭EM,否则资源就会到处泄漏
NucleusJPAHelper.getEntityManager(obj);是如何获得管理对象的EntityManager(在DataNucleus v3.x中,由GAE JPA v2.x使用)