有没有办法跟踪实体的变化?

时间:2012-06-19 11:25:03

标签: java-ee jpa jpa-2.0 java-ee-6

我有一个实体。在事务中修改此实体。但在某些时候,我想知道在交易过程中对该实体所做的更改。原因是触发对实体的更改的差异导出。我已经开发了这个“解决方案”:

public void triggerExport(A a)
{
    em.detach(a);
    A result = em.find(A.class, a.internId);

    doExport(a, result);
    em.merge(a);

}

我不确定这是否真的是一种切实可行的方法。它为该实体的每个比较引起额外的数据库交互。你怎么看?还有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

您还可以创建一个新的EntityManager并找到该对象,这将保存分离和合并对象。

如果您正在使用EclipseLink,则可以从EntityManager中解包UnitOfWork并调用getCurrentChanges()以获取事务中所做更改的更改集。如果使用共享缓存,您还可以使用getOriginalVersionOfObject()来获取原始对象。

EclipseLink还具有完整的历史记录支持,

见, http://wiki.eclipse.org/EclipseLink/Examples/JPA/History

答案 1 :(得分:2)

我没有亲自使用过这个,但听到了关于JBoss Envers的好消息,这是一个与Hibernate集成的审计工具。您可以使用它来审核实体的更改内容,并导出特定的更改。

答案 2 :(得分:0)

如果您使用Hibernate,默认情况下它使用第一级缓存来缓存默认情况下在同一会话中进行的可重复查询。

来自Hibernate Recipes: A Problem-Solution Approach book

  

第一级缓存位于事务级别或工作单元。   它在Hibernate中默认启用。第一级缓存是   与会话相关联。如果同一个查询执行多次   在同一会话中,与查询关联的数据是   缓存。

     

假设您检索了一个对象   在一个会话中不止一次:Hibernate将数据库查询为   多次调用查询?

Session session = factory.openSession();
try {
Book book1 = (Book) session.get(Book.class, id);
Book book2 = (Book) session.get(Book.class, id);
} finally {
session.close();
}
  

如果你检查Hibernate执行的SQL语句,你只能找到它   进行一次数据库查询。这意味着Hibernate正在缓存你的   同一会话中的对象。这种缓存称为   第一级缓存,其缓存范围是会话。