1

我在数据库中存储了一个相对复杂的不可变对象。有许多多对一的关联——对象有属性,有属性等等。

我希望每个对象只存储一次,基于一个业务键,在这种情况下是对象的每个属性。

工作流程是这样的:

  • 用户创建一个复杂的对象。这可能需要很长时间,代码都分散在各处。
  • 我查询数据库,看看之前是否已经存储了完全相同的对象:
    • 如果不,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

我怎样才能做到这一点?

4

1 回答 1

0

我相信 saveOrUpdate 完全符合您的要求。但它的行为也取决于您的映射。

如果您执行 saveOrUpdate,它会给您预期的结果吗?


这里有点跑题了:你知道 Query By Example 吗?http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-examples


没关系。我刚看到这个问题已经两年了。愚蠢的“相关问题”——stackoverflow 的选项。

于 2012-07-24T19:36:45.453 回答