gpt4 book ai didi

Java JPA : How to check if an Entity is out of sync (or 'dirty' ) or be notified of changes to the dirty state

转载 作者:行者123 更新时间:2023-11-30 11:22:25 26 4
gpt4 key购买 nike

情况

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

问题

如何检查实体和底层数据库是否不同步(即实体)。

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

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

如果无法使用 JPA,也欢迎使用 Hibernate 4 持久性 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
}
}
}
}

最佳答案

您可以使用实体监听器(请参阅 JPA 2.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 属性。这是一个更简单的解决方案,它甚至可以在 JPA 1.0 中工作。这是我会选择的解决方案。

关于Java JPA : How to check if an Entity is out of sync (or 'dirty' ) or be notified of changes to the dirty state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21724051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com