嗨,我强迫Envers问题。每类扩展包含@GeneratedAuto的ID等。有两个实体BaseEntity:休眠Envers找到OneToMany JoinTable
@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查找方法时,它会返回所有属于伤害但不关心revisionId的字典数据的正确伤害。在数据库中,一切都保存正确。我认为,如果表加入,那么envers看起来只是如果id是正确的,而不看版本。休眠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: 我发现找到查询与RevNumber寻找handballDictionaryFact小于或等于handballInjury.RevNumber。我现在的问题是,我可以迫使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票据,并用一个简单的测试案例来报告问题,以重现错误。 – Naros
调试后我发现envers从firstlevelcache而不是数据库获取数据。但不知道如何改变这一点。 – MrNetroful
你是说它从Session的1LC或Envers的内部1LC中获取数据,因为它们是两回事。你可以用查询更新你的文章,以及你如何观察这种行为? – Naros