Java 具有不同列表实现的RevisionRepository返回实体(PersistanceBag->;ListProxy)

Java 具有不同列表实现的RevisionRepository返回实体(PersistanceBag->;ListProxy),java,jpa,testing,hibernate-envers,spring-data-envers,Java,Jpa,Testing,Hibernate Envers,Spring Data Envers,返回列表为ListProxy的实体 正常积垢 org.springframework.data.repository.history.RevisionRepository Entity entity = repository.findLastChangeRevision(entity.getId()).get().getEntity(); 返回具有相同内容的相同实体,但列表类型为PersistentBag 在集成测试中断言这两个对象会出现这种不同的情况 有解决方案吗?不测试内容是否相等,而是测

返回列表为ListProxy的实体

正常积垢

org.springframework.data.repository.history.RevisionRepository
Entity entity = repository.findLastChangeRevision(entity.getId()).get().getEntity();
返回具有相同内容的相同实体,但列表类型为PersistentBag

在集成测试中断言这两个对象会出现这种不同的情况


有解决方案吗?

不测试内容是否相等,而是测试内容是否相等。如何做到这一点取决于您使用的测试和断言库

例如,AssertJ为此提供了和

一些模糊的背景

Hibernate,一般来说,所有JPA实现和大多数ORM要么替换/操作类的字节码,要么使用代理或特殊实现来完成它们的工作。一个重要的部分是脏跟踪,即当您更改实体时,JPA会注意到,例如,通过将元素添加到集合中。为了做到这一点,他们必须做一些魔术,比如用通知JPA实现此类操作的其他类替换您的列表


因此,您可能会在实体实例中找到JPA实现的实现。

您如何断言结果?列表通常是相等的,只要它们包含相同的元素,而不管具体的实现i assert by assertEquals 2实体包含这些列表。我临时制定了一个方法,一个字段一个字段地进行比较。我按照你说的做了,但我很好奇为什么它是这样的。我在答案中添加了一个部分。
repository.findById(id)