【发布时间】:2017-07-24 14:37:49
【问题描述】:
您好,我强迫 Envers 出问题。每个类都扩展了包含@GeneratedAuto id 等的 BaseEntity。有两个实体:
@Audited
@Entity
public class HandballInjury extends Injury {
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "HandballDictionaryFact")
private List<HandballDictionaryFact> handballDictionaryFacts = new ArrayList<HandballDictionaryFact>();
private HandballTimeOfInjury timeOfInjury;
...
}
还有
@Audited
@Entity
@Table(name = "handballDictionaryFact")
public class HandballDictionaryFact extends DictionaryFact{
...
}
*父母双方都有@Audited 注释。我的问题是,当我在 HandballInjury 上使用 AuditEntity 查找方法时,它会返回正确的伤害,其中包含属于伤害但不关心修订 ID 的所有 dictionaryFacts。在数据库中,一切都正确保存。我认为,如果表已连接,则 envers 只会查看 id 是否正确,而无需查看修订。 Hibernate Envers 版本:5.1.0.Final
编辑 1:
我发现我没有通过 SessionFactory.openSession() 打开新会话。因此,envers 正在进入 1 LevelCache 以获取数据。我已经修复了它,但它没有帮助。这就是查询的启动方式:
result = getReader().find(HandballInjury.class, ((HandballInjury) object).getId(), revisionNumber);
也许我应该编写自己的查询?
我注意到下面的查询还返回 HandballDictionaryFacts_aud 中的所有实体,而不是指定的 revisionNumber。
List<HandballDictionaryFact> dictionaryFact = getReader().createQuery()
.forEntitiesAtRevision(HandballDictionaryFact.class, revisionNumber).getResultList();
编辑 2: 我发现 find 查询正在查找 RevNumber 小于或等于 handballInjury.RevNumber 的 handballDictionaryFact。我的问题是现在我可以强迫 envers 看起来只是平等的吗?部分查询:
and handballdi1_.REV=(
select
max(handballdi2_.REV)
from
dictionaryfact_AUD handballdi2_
where
handballdi2_.DTYPE='HandballDictionaryFact'
and handballdi2_.REV<=?
and handballdi1_.id=handballdi2_.id
)
第一次编辑的查询还会检查 revNumber 是否小于或等于。
【问题讨论】:
-
Envers 应该应用
REV谓词,以便与聚合根的任何关联,在本例中为HandballInjury,将等于或小于聚合根的关联。如果您绝对确定它没有这样做,请打开 JIRA 票证并使用重现错误的简单测试用例报告问题。 -
调试后发现envers从firstlevelcache而不是数据库中获取数据。但不知道如何改变它。
-
您是说它从 Session 的 1LC 或 Envers 的内部 1LC 获取数据,因为它们是两个不同的东西。您能否使用查询更新您的帖子以及您如何观察这种行为?
标签: java spring hibernate hibernate-envers