Java JPA:如何检查实体是否不同步(或';脏&';)或收到脏状态更改的通知
形势 我有一个web应用程序,它使用JPA作为底层数据库的链接。当用户通过UI修改实体时,这些更改不会立即保存到数据库中 问题 如何检查实体和基础数据库是否不同步(即,实体脏) 此外,是否可以自动(例如通过侦听器机制)收到通知 这是否可以使用JPA规范?我目前使用Hibernate作为底层持久性管理器,但是JPA(EntityManager)中的解决方案会更好 如果无法使用JPA,也欢迎使用Hibernate 4 persistency API的解决方案 目的 我想使用它将脏对象的UI表示标记为脏 较长版本 加载web UI时,将从数据库加载实体。然后,用户可以在UI中修改这些实体。但是,这些更改不会立即保存到数据库中 为此,用户必须按下保存按钮,该按钮在持久性模块中执行以下代码:Java JPA:如何检查实体是否不同步(或';脏&';)或收到脏状态更改的通知,java,jpa,persistence,Java,Jpa,Persistence,形势 我有一个web应用程序,它使用JPA作为底层数据库的链接。当用户通过UI修改实体时,这些更改不会立即保存到数据库中 问题 如何检查实体和基础数据库是否不同步(即,实体脏) 此外,是否可以自动(例如通过侦听器机制)收到通知 这是否可以使用JPA规范?我目前使用Hibernate作为底层持久性管理器,但是JPA(EntityManager)中的解决方案会更好 如果无法使用JPA,也欢迎使用Hibernate 4 persistency API的解决方案 目的 我想使用它将脏对象的UI表示标记为
// in data-persistency module
public class MyObjectManager {
...
public void saveMyObject(MyObjectEntity moe) {
...
EntityManager em = DatabaseJPAConnector.getEntityManager();
em.getTransaction().begin();
moe.saveOrUpdate(em); // persists or merges moe and all its childs
em.getTransaction().commit();
...
}
...
}
要测试对象是否不同步,我需要一种方法来验证实体当前是否脏,和/或一种事件机制来在脏状态更改时自动通知感兴趣的GUI元素:
// in data-persistency module
public class MyObjectManager {
...
public boolean isDirty(MyObjectEntity moe) {
...
EntityManager em = DatabaseJPAConnector.getEntityManager();
return ???
}
...
public void addDirtyListener(DirtyStateListener listener) {
// publisher-subscriber pattern
}
}
// in gui module
public class MyGUIComponent {
if (data.isDirty(moe)) {
// mark UI object as dirty
}
MyGUIComponent() {
data.addDirtyListener(new DirtyStateListener() {
public void dirtyStateChanged(DirtyStateEvent event) {
// update dirtyness state of UI object
}
}
}
}
您可以使用实体监听器(参见JPA2.1规范的第3.5章)。在
@PostUpdate
和@PostRemove
方法中,您可以触发CDI事件-请参阅第3.5.1节。但是这个解决方案有它的局限性
Entity listener classes in Java EE environments support dependency injection through the
Contexts and Dependency Injection API (CDI) [ 10 ] when the containing archive is a bean
archive.
另一种解决方案是使用乐观锁定和@Version
属性。这是一个简单得多的解决方案,即使在JPA1.0中也可以使用。这是我选择的解决方案