【发布时间】:2018-03-03 03:39:58
【问题描述】:
我的应用程序使用 SpringBoot、Hibernate 和 Spring Data JPA 来实现奇迹。我正在尝试将 Hibernate 的 Envers 库添加到其中,以进行修订跟踪。但是,我在 Envers 和 @Version 注释之间遇到了一些冲突。
默认情况下,Envers 不会审核任何带有@Version 注释的字段。这对我来说很有意义,因为@Version 只是为了跟踪乐观锁定,所以我真的不需要保留它的修订历史。
但是,我遇到的问题是,当我获得修订实体时,它不会随版本返回。这是有道理的 - Envers 将修订实体存储在 ..._AUD 表中,并且该表没有 Version 列,因此显然该实体不会有 Version。问题是我有时想将该实体用作另一个事务的一部分*,但由于它没有版本,因此该实体被视为瞬态并引发异常。
所以我有几个不同的解决方案,但似乎都不是理想的,所以我希望就我能做到这一点的最佳方式获得一些意见:
我可以获取修订实体,然后使用修订实体中的 id 进行单独的存储库调用以获取实际实体,然后仅使用该实体。这会增加很多复杂性(尤其是在确定要使用的正确存储库时)和似乎不必要的额外数据库调用。
我可以保存版本。这并不理想,因为它不是我真正关心的信息,但如果它意味着一个有效的、有效的系统,我可以处理它。我也试过这个并且遇到了问题(在我的配置中将 doNotAuditOptimsticLockingField 设置为 true 似乎没有任何作用),但如果确定这是最好的解决方案,我将打开一个单独的问题来处理它。
我可能会更改未能使用 ID 而不是实际实体的存储库调用,但如果我必须更改许多其他存储库调用以使其工作,我不会感到惊讶.
如果有第四个选项,我会全力以赴!
*:另一个事务是在将实体转换为要由 REST 端点返回的资源时发生的数据库调用。我拥有的实体之一是 AccountEntity。我得到的修订实体就是被这个方法使用的:
LinkOwnerEntity findByAccountEntity(AccountEntity accountEntity);
linkOwner Entity 类看起来像这样:
public class LinkOwnerEntity {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ACCOUNT_ID", unique=true, foreignKey = @ForeignKey(name = "FK_OWNER_ACCOUNT_ID"))
private AccountEntity accountEntity;
...
}
【问题讨论】:
标签: java hibernate jpa spring-boot hibernate-envers