Java 实体图上的JPA变更事件[EclipseLink]
我是否可以只使用JPA以某种方式跟踪整个实体图状态 考虑使用至少有一个集合的两个或三个类的层次结构 通过使用JPA@Post。。。注释我只能跟踪实际的实体,而不能跟踪其子实体和/或集合,因为它几乎只是数据库事件包装 我知道Hibernate可以做到这一点,但我不想依靠JPA的实现来实现这一点Java 实体图上的JPA变更事件[EclipseLink],java,hibernate,jpa,Java,Hibernate,Jpa,我是否可以只使用JPA以某种方式跟踪整个实体图状态 考虑使用至少有一个集合的两个或三个类的层次结构 通过使用JPA@Post。。。注释我只能跟踪实际的实体,而不能跟踪其子实体和/或集合,因为它几乎只是数据库事件包装 我知道Hibernate可以做到这一点,但我不想依靠JPA的实现来实现这一点 如果有一种方法至少可以用EclipseLink做到这一点,我会非常高兴。不确定这是否是您要搜索的内容, 但您可以检测实体上的更改,如下所示: Account a = em.merge(account);
如果有一种方法至少可以用EclipseLink做到这一点,我会非常高兴。不确定这是否是您要搜索的内容, 但您可以检测实体上的更改,如下所示:
Account a = em.merge(account);
final JpaEntityManager jpaEntityManager = (JpaEntityManager) em.getDelegate();
final UnitOfWorkChangeSet changeSet = jpaEntityManager.getUnitOfWork().getCurrentChanges();
final ObjectChangeSet accountChangeSet = changeSet.getObjectChangeSetForClone(a);
final ObjectChangeSet userChangeSet = changeSet.getObjectChangeSetForClone(a.getUser());
em.clear();
//checks only for these 2 specific fields; changeSet.hasChanges() would check for all changes
return accountChangeSet.hasChangeFor("credits") || userChangeSet.hasChangeFor("name");
希望这能有所帮助 谢谢你的回答,但是没有。我已经在EclipseLink中找到了一种方法,因为EclipseLink处理@PostUpdate/。。。方法非常好(集合的更新被发送到拥有的实体,等等),而其他JPA很遗憾没有。我想我必须为我想在API中支持的每一个提供者提供一个自定义实现。我接受了这一点,因为我要求在EclipseLink中实现这一点就足够了。它有点不,但我是一个言而有信的人。很遗憾听到你现在必须做一个自定义实现。如果只有Hibernate能够满足您目前的需求,那么将其作为即将发布的JPA版本的一项功能进行请求可能是有意义的。EclipseLink也有一个可以工作的实现。在我看来,每个JPA提供商都必须拥有一些(至少是内部)事件系统,这些系统可以通过通用JPA API加以利用,但对于这一点,必须就事件的分发方式达成普遍共识。我目前正在为通用JPA进行Hibernate搜索改编(我需要这些事件),我正在与一些Hibernate开发人员联系。是的,作为即将发布的JPA的一个新特性,这无疑是有意义的。事实上,我想我会在将来的某个时候,当我的东西更成熟的时候,提出这个要求。