Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:如何检查实体是否不同步(或';脏&';)或收到脏状态更改的通知_Java_Jpa_Persistence - Fatal编程技术网

Java JPA:如何检查实体是否不同步(或';脏&';)或收到脏状态更改的通知

Java JPA:如何检查实体是否不同步(或';脏&';)或收到脏状态更改的通知,java,jpa,persistence,Java,Jpa,Persistence,形势 我有一个web应用程序,它使用JPA作为底层数据库的链接。当用户通过UI修改实体时,这些更改不会立即保存到数据库中 问题 如何检查实体和基础数据库是否不同步(即,实体脏) 此外,是否可以自动(例如通过侦听器机制)收到通知 这是否可以使用JPA规范?我目前使用Hibernate作为底层持久性管理器,但是JPA(EntityManager)中的解决方案会更好 如果无法使用JPA,也欢迎使用Hibernate 4 persistency API的解决方案 目的 我想使用它将脏对象的UI表示标记为

形势

我有一个web应用程序,它使用JPA作为底层数据库的链接。当用户通过UI修改实体时,这些更改不会立即保存到数据库中

问题

如何检查实体和基础数据库是否不同步(即,实体脏)

此外,是否可以自动(例如通过侦听器机制)收到通知

这是否可以使用JPA规范?我目前使用Hibernate作为底层持久性管理器,但是JPA(EntityManager)中的解决方案会更好

如果无法使用JPA,也欢迎使用Hibernate 4 persistency API的解决方案

目的

我想使用它将脏对象的UI表示标记为脏

较长版本

加载web UI时,将从数据库加载实体。然后,用户可以在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中也可以使用。这是我选择的解决方案