Google App Engine:ID为“”的对象由另一个对象管理器管理 - 重新访问

时间:2013-02-07 21:52:57

标签: spring google-app-engine jpa datanucleus

我使用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);
}

我发现了这些相关的问题,但我仍然无法修复。

  1. AppEngine datastore: "Object with id ... is managed by a different Object Manager"
  2. Google App Engine - Object with id "" is managed by a different - JPA
  3. Datanucleus: moving from @Transactional to non-transactional
  4. http://www.atentia.net/2010/03/object-with-id-is-managed-by-a-different-object-manager/
  5. WRT关闭PM(按照1&amp; 2),我无法明确关闭PM,因为我使用的是Spring org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter。从日志中,它似乎是在每个页面请求上打开和关闭。

    WRT使实体可拆卸(按照3&amp; 4),首先,我使用的是JPA,使用与JDO相关的注释似乎是错误的。其次,当我尝试时它没有用。

    为了额外的功劳,你如何使用JDOHelper.getPersistenceManager(obj)进行调试?在这种情况下,我得到null,因为用户在页面请求之间分离。这对我来说似乎很正常,所以我不清楚如何调试它。

1 个答案:

答案 0 :(得分:1)

  1. 你没有PM,你有一个EM。不知道你在那里指的是什么。
  2. 可拆卸:使用JPA所有类别(增强为)可拆卸
  3. 您在那里使用了一些古老的GAE JPA插件(v1.x?),并使用了不受支持的旧版DataNucleus。使用GAE JPA v2.x. “ObjectManager”在DataNucleus中已经存在多年了。
  4. 您(或您正在使用的软件)必须关闭EM,否则您会在整个地方泄露资源。
  5. NucleusJPAHelper.getEntityManager(OBJ);是如何获得管理对象的EntityManager(在DataNucleus v3.x中,由GAE JPA v2.x使用)