我有一个实体,引用另一个实体,如下所示:
@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修订版?
答案 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非常重要。
假设您执行以下操作
MyCustomEntity
的{{1}}修订版。OtherEntity
(现在的修订号高于OtherEntity
)MyCustomEntity
(现在的修订号高于MyCustomEntity
)OtherEntity
。最新版本将指向MyCustomEntity
并在步骤2中进行了修改。不变性注释根本不允许更改FK参考。
这会解决您的问题吗?
<强>更新强>
我希望
OtherEntity
始终指向同一版本的MyCustomEntity
。因此,即使OtherEntity
发生更改,OtherEntity
也无法看到更改。
这正是Envers的工作原理。
MyCustomEntity
只返回相关关联,其修订号等于或小于其查询的修订版。
这意味着如果您修改MyCustomEntity
然后查询OtherEntity
,则返回的MyCustomEntity
实例将不包含最近的更改。
OtherEntity
唯一一次返回MyCustomEntity
关联的最新快照的时间是OtherEntity
在同一事务中修改MyCustomEntity
或OtherEntity
之后的未来事务。
始终返回关联,其关联实体类型的修订号不是查询实体的修订号<=
。
我改变了两者。
如果您要同时更改这两项更改,那么执行这些更改的顺序将会影响审核查询中关系将返回的快照。
如果您的目标是某种方式 pin 一个修订版,那么确实没有合适的逻辑方法,至少在相同的事务边界内,不管怎么说在预提交事务回调中执行其逻辑。