- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
情况
我有一个 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/
我是一名优秀的程序员,十分优秀!