参考实体的具体修订

时间:2017-08-25 06:00:29

标签: hibernate hibernate-envers

我有一个实体,引用另一个实体,如下所示:

@Entity(name = "MyCustomEntity")
@Table(name = "my_custom_entity")
public class MyCustomEntity {

    @Id
    Integer id;

    @ManyToOne
    @JoinColumn(name = "profile_id")
    OtherEntity other;
}

事实证明,业务逻辑规定OtherEntity在此上下文中不应该是可变的。由于您仍然可以在此上下文之外更改实体,因此我认为将引用从MyCustomEntity更改为Envers修订版是最简单的。

我可以使用此代码段替换引用:

@Entity(name = "MyCustomEntity")
@Table(name = "my_custom_entity")
public class MyCustomEntity {

    @Id
    Integer id;

    Integer otherId;
    Integer revision;
}

OtherEntity getOther(MyCustomEntity entity) throws Exception {
   return auditReader.find(OtherEntity.class, entity.otherId, entity.revision);
}

但是我失去了一些我非常喜欢的Hibernate功能。

有没有更好的方法来引用Envers修订版?

1 个答案:

答案 0 :(得分:0)

基于您只想通过两个实体之间的关系强制实现不变性这一事实,为什么不在这里简单地使用@Immutable注释,而不是试图通过模型来操纵它。

@Entity(name = "MyCustomEntity")
@Table(name = "my_custom_entity")
public class MyCustomEntity {
  @Id
  private Integer id;

  @ManyToOne
  @JoinColumn(name = "profile_id")
  @Immutable
  private OtherEntity other;

  ...
}

但了解此内容中的Immutable仅适用于ORM非常重要。

假设您执行以下操作

  1. 创建指向MyCustomEntity的{​​{1}}修订版。
  2. 修改OtherEntity(现在的修订号高于OtherEntity
  3. 修改MyCustomEntity(现在的修订号高于MyCustomEntity
  4. 使用最新版本查询OtherEntity
  5. 最新版本指向MyCustomEntity并在步骤2中进行了修改。不变性注释根本不允许更改FK参考。

    这会解决您的问题吗?

    <强>更新

      

    我希望OtherEntity始终指向同一版本的MyCustomEntity。因此,即使OtherEntity发生更改,OtherEntity也无法看到更改。

    这正是Envers的工作原理。

    MyCustomEntity只返回相关关联,其修订号等于或小于其查询的修订版。

    这意味着如果您修改MyCustomEntity然后查询OtherEntity,则返回的MyCustomEntity实例将不包含最近的更改。

    OtherEntity唯一一次返回MyCustomEntity关联的最新快照的时间是OtherEntity在同一事务中修改MyCustomEntityOtherEntity之后的未来事务。

    始终返回关联,其关联实体类型的修订号不是查询实体的修订号<=

      

    我改变了两者。

    如果您要同时更改这两项更改,那么执行这些更改的顺序将会影响审核查询中关系将返回的快照。

    如果您的目标是某种方式 pin 一个修订版,那么确实没有合适的逻辑方法,至少在相同的事务边界内,不管怎么说在预提交事务回调中执行其逻辑。