Java 带有JPA的GAE:更新实体

Java 带有JPA的GAE:更新实体,java,google-app-engine,jpa,Java,Google App Engine,Jpa,我在更新谷歌应用程序引擎中的实体时遇到问题 EntityManager em = ... // constructed like in the doc MyEntity myE = new MyEntity(); myE.setType("1"); // String em.persist(myE);em.refresh(myE); myE.setType("2"); em.merge(myE);em.refresh(myE); 我希望实体具有type=“2”,但只有一个实体具有

我在更新谷歌应用程序引擎中的实体时遇到问题

EntityManager em = ... // constructed like in the doc

MyEntity myE = new MyEntity();
myE.setType("1");      // String
em.persist(myE);em.refresh(myE);

myE.setType("2");
em.merge(myE);em.refresh(myE);

我希望实体具有
type=“2”
,但只有一个实体具有
type=“1”
:-(

这是因为merge创建实体的新实例,从提供的实体复制状态,并管理新副本。您可以找到有关merge与persist的更多信息,以及关于它的完整讨论,让我解释一下,这是正确的行为(我假设您的所有代码都在相同的持久性上下文/事务中运行)


我也面临着类似的问题。我的问题在提交()之后放置Reresh()后得到解决

可能是这样的:

em.getTransaction().begin();
//Code to update the entity
em.persist(myE);
em.getTransaction().commit();
em.refresh(myE)
这将确保JPA缓存中的更新实体使用更新的数据进行刷新。
希望这有帮助。

如果实体是分离的或暂时的,这是正确的。如果它是附加的,merge将返回您作为参数传递的实体(而merge没有用,因为该实体已经附加)。从OP的帖子中不清楚代码的最后一部分是否与第一部分在同一事务中。我猜安全的方法是使用myE=em.merge(myE);
em.getTransaction().begin();
//Code to update the entity
em.persist(myE);
em.getTransaction().commit();
em.refresh(myE)