我在数据库中存储了一个相对复杂的不可变对象。有许多多对一的关联——对象有属性,有属性等等。
我希望每个对象只存储一次,基于一个业务键,在这种情况下是对象的每个属性。
工作流程是这样的:
- 用户创建一个复杂的对象。这可能需要很长时间,代码都分散在各处。
- 我查询数据库,看看之前是否已经存储了完全相同的对象:
- 如果不,
save
- 如果是,设置对象的 id 和
merge
- 如果不,
问题是 Hibernate 的merge
语义非常不方便:
transientObject = createComplexTransientObject();
mergedObject = session.merge(transientObject);
// here you have to discard transientObject
// use mergedObject from now on
创建的对象必须被丢弃并替换为 Hibernate 提供的对象,这意味着我必须更新对它的所有引用。
我需要一种方法来告诉休眠:“这个全新的瞬态对象似乎与数据库中已经存在的对象相同。将其合并到位。” 换句话说:
object = createComplexTransientObject();
session.inPlaceMerge(object);
// object is now persistent
我怎样才能做到这一点?