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
Jakarta ee 是否有方法跟踪实体的更改?_Jakarta Ee_Jpa_Jpa 2.0_Java Ee 6 - Fatal编程技术网

Jakarta ee 是否有方法跟踪实体的更改?

Jakarta ee 是否有方法跟踪实体的更改?,jakarta-ee,jpa,jpa-2.0,java-ee-6,Jakarta Ee,Jpa,Jpa 2.0,Java Ee 6,我有一个实体。此实体在事务中被修改。但在某个时刻,我想知道在交易过程中对该实体所做的更改。这样做的原因是触发对实体更改的差异输出。我已经开发了这个“解决方案”: 我不确定这是否真的是一种可行的方法。它会为此实体的每个比较导致额外的数据库交互。你怎么认为?有更好的方法吗?如果使用Hibernate,默认情况下,它使用一级缓存来缓存默认情况下在同一会话中进行的可重复查询 发件人: 第一级缓存位于事务级别或工作单元。 默认情况下,它在Hibernate中启用。第一级的缓存是 与会话关联的。如果同一查询

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


我不确定这是否真的是一种可行的方法。它会为此实体的每个比较导致额外的数据库交互。你怎么认为?有更好的方法吗?

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

发件人:

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

假设您检索到一个对象 在一个会话中不止一次:Hibernate是否按以下方式查询数据库 调用查询的次数

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


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

发件人:

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

假设您检索到一个对象 在一个会话中不止一次:Hibernate是否按以下方式查询数据库 调用查询的次数

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


我个人并没有使用过这个工具,但听说过它是一个与Hibernate集成的审计工具。您可以使用它来审核实体的更改,并导出特定的更改。

我个人没有使用过它,但听说过它是一个与Hibernate集成的审核工具。您可以使用它来审核实体的更改,并导出特定的更改。

您还可以创建一个新的EntityManager并查找对象,这样可以避免分离和合并对象

如果使用EclipseLink,可以从EntityManager中展开UnitOfWork,并调用getCurrentChanges()以获取事务中所做更改的更改集。如果使用共享缓存,还可以使用GetOriginalVersionFobject()获取原始对象

EclipseLink也有完整的历史支持

看,,

您还可以创建一个新的EntityManager并找到该对象,这将节省分离和合并该对象的时间

如果使用EclipseLink,可以从EntityManager中展开UnitOfWork,并调用getCurrentChanges()以获取事务中所做更改的更改集。如果使用共享缓存,还可以使用GetOriginalVersionFobject()获取原始对象

EclipseLink也有完整的历史支持

看,,

我知道你的想法,但也许你没有注意到我分离了实体。在从持久性上下文中分离实体的情况下,该实体不再位于事务缓存中。这就是为什么我能够获得差异的原因,因为提供者需要对数据库执行新的查询。我知道您的想法,但可能您没有注意到我分离了实体。在从持久性上下文中分离实体的情况下,该实体不再位于事务缓存中。这就是为什么我能够得到差异的原因,因为提供者需要对数据库进行新的查询。
public void triggerExport(A a)
{
    em.detach(a);
    A result = em.find(A.class, a.internId);

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

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