所以我有跟随实体,使用以下代码来创建和更新对象。调用该方法后生成的数据是,在我的本地计算机上运行的数据存储区中,字段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。
答案 0 :(得分:2)
正如JPA规范所说,你不能直接更新实体对象的字段,但是在你发布的代码中你就是这样做的(所以持久性提供者无法知道某些事情发生了变化,并且所以无法将这些更改刷新到数据存储区)。
DataNucleus JPA实际上允许您直接更新字段如果您将使用它的类增强为“PersistenceAware”。
解决方案:使用setter更新字段