为什么此JPA代码不会更新AppEngine本地数据存储区中的实体?

时间:2013-02-27 15:36:37

标签: google-app-engine jpa

所以我有跟随实体,使用以下代码来创建和更新对象。调用该方法后生成的数据是,在我的本地计算机上运行的数据存储区中,字段Value的值为1。为什么?是不是JPA管理的对象(或this article中描述的附加)并且应该在em2.close()上更新自己?

实体:

@Entity 
public class MyObj {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long Id;
    public int Value = 0;
}

代码:

public void createAndUpdate() {
    Long id = null;
    // Line below calls Persistence.createEntityManagerFactory("transactions-optional").createEntityManager()
    EntityManager em1 = Database.getEntityManager(); 
    MyObj obj = new MyObj();
    obj.Value = 1;      
    em1.persist(obj);
    em1.close();
    id = obj.Id;

    EntityManager em2 = Database.getEntityManager();
    obj = (MyObj) em2.find(MyObj.class, id);
    obj.Value = 2;
    // NOTE1
    em2.close();        
}

在标有NOTE1的行上,我尝试插入em2.persist(obj)em2.merge(obj)(即使从我读过的内容来看,这不应该是必要的,因为find()会返回附加对象)。他们都没有帮助。

我正在使用JPA v1。

1 个答案:

答案 0 :(得分:2)

正如JPA规范所说,你不能直接更新实体对象的字段,但是在你发布的代码中你就是这样做的(所以持久性提供者无法知道某些事情发生了变化,并且所以无法将这些更改刷新到数据存储区)。

DataNucleus JPA实际上允许您直接更新字段如果您将使用它的类增强为“PersistenceAware”。

解决方案:使用setter更新字段