2

所以我有下面的实体和下面的代码来创建和更新对象。调用该方法后的结果数据是该字段Value的值1在我本地计算机上运行的 Datastore 中。为什么?对象不是由 JPA 管理(或按本文所述附加)并且应该在其上进行自我更新吗?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)and em2.merge(obj)(即使从我读过的内容来看,这不应该是必要的,因为find()返回了一个附加的对象)。他们都没有帮助。

我正在使用 JPA v1。

4

1 回答 1

2

正如 JPA 规范所说,您不能直接更新 Entity objects 的字段,但是在您发布的代码中您就是这样做的(因此持久性提供程序无法知道某些内容已更改,因此无法将这些更改刷新到数据存储区)。

如果您将执行此操作的类增强为“PersistenceAware”,DataNucleus JPA实际上确实允许您直接更新该字段。

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

于 2013-02-27T15:42:47.833 回答