我正在尝试重构一个旧服务项目,其中底层数据库被不同方访问,因此我无法自由更改数据结构。 该项目的代码现在是Hibernate和直接数据库访问的混合体,我想将其引入同源JPA实现。
目前,我正面临着对JPA内部工作的理解,并希望找到以下问题的一些澄清和/或最佳实践:
我有一个Transition实体如下(剥离到有趣的部分):
Transition
id
oldStatus
newStatus
保存转换时,客户端为新状态和旧状态提供ID(这是另一个实体的ID)。每个转换都将与生成的id一起存储。由于oldStatus和newStatus的组合应该是唯一的,所以代码现在就是这样的:
Result r = query(select * from Transition where oldStatus='?' and newStatus='?')
if(r == null)
persist
else
use id of r
如果我正确理解内部工作原理,Hibernate不会考虑hash()/ equals()方法,而只考虑@ID字段以决定实体是否存在。由于客户端不知道转换的ID,而只知道模型的旧状态和新状态,因此无法预先提供ID。有没有办法让Hibernate / JPA检查除@ID annoted字段之外的其他字段?
Transition实体在另一个实体中多次使用,并且更新该实体需要检查客户端针对数据库中现有Transitions提供的Transitions的值,并在传递实体之前更新提供的实体中的id持久/合并机制。
是否可以以持久/合并时Hibernate能够连接正确Transition的方式配置实体?