gpt4 book ai didi

java - 将 @Version 与 Envers 一起使用

转载 作者:太空宇宙 更新时间:2023-11-04 11:07:27 25 4
gpt4 key购买 nike

我的应用程序使用 SpringBoot、Hibernate 和 Spring Data JPA 来实现奇迹。我正在尝试将 Hibernate 的 Envers 库添加到此,以进行修订跟踪。但是,我在 Envers 和 @Version 注释之间遇到了一些冲突。

默认情况下,Envers 不会审核任何使用 @Version 注释的字段。这对我来说很有意义,因为 @Version 只是为了跟踪乐观锁定,所以我真的不需要保留它的修订历史记录。

但是,我遇到的问题是,当我获取修订实体时,它不会随版本一起返回。这是有道理的 - Envers 将修订实体存储在 ..._AUD 表中,并且该表没有版本列,因此显然该实体不会有版本。问题是,我有时想使用该实体作为另一个事务*的一部分,但由于它没有版本,因此该实体被视为 transient 并引发异常。

所以我有一些不同的解决方案,但它们似乎都不理想,所以我希望获得一些关于实现此目标的最佳方法的意见:

  1. 我可以获取修订实体,然后使用修订实体中的 id 进行单独的存储库调用以获取实际实体,然后仅使用该实体。这会增加很多复杂性(特别是在确定要使用的正确存储库时)以及似乎不必要的额外数据库调用。

  2. 我可以保存版本。这并不理想,因为它不是我真正关心的信息,但如果它意味着一个有效的工作系统,我可以处理它。我也尝试过这个,但遇到了问题(在我的配置中将 doNotAuditOptimsticLockingField 设置为 true 似乎没有执行任何操作),但如果确定这是最佳解决方案,我将打开一个单独的问题来处理它。

  3. 我可能会更改无法使用 ID 而不是实际实体的存储库调用,但如果我必须更改许多其他存储库调用才能完成此工作,我不会感到惊讶。

如果有第四种选择,我洗耳恭听!

*:另一个事务是在将实体转换为 REST 端点返回的资源时发生的数据库调用。我拥有的实体之一是 AccountEntity。我得到的修订实体是通过这种方法使用的:

LinkOwnerEntity findByAccountEntity(AccountEntity accountEntity);

linkOwner 实体类如下所示:

public class LinkOwnerEntity {

...

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ACCOUNT_ID", unique=true, foreignKey = @ForeignKey(name = "FK_OWNER_ACCOUNT_ID"))
private AccountEntity accountEntity;

...

}

最佳答案

乐观锁定就是确保您看到的数据就是您将要修改的数据。因此,当用户决定在屏幕上恢复旧版本(我想这就是您想要对 Envers 执行的操作)时,他应该看到内容的当前版本和他想要恢复的内容的旧版本。您需要保留用户看到的版本的版本字段作为当前版本,并将其在请求中发送到应用程序并使用它来保存修改。

这样,如果数据在用户查看后被修改,他的修改将被拒绝,而不是覆盖其他人的修改。

关于java - 将 @Version 与 Envers 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46349802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com