2

嗨,我知道并在合并之前进行测试会将对象重新附加回会话,以防止当对象不再处于会话中时出现延迟初始化异常。

a.) 所以我有几个问题。

如果我付款-> 客户(在多对一的单向关系中)并且我愿意

支付支付 = Payment.class.cast(session.merge(oldPayment));

客户对象是否也会重新附加到会话中,或者我是否必须为客户进行另一个合并调用。

b.) 如果付款--> 客户(多对一双向关系)会发生什么。比会发生什么。

c.)如果我有超过三个层次的关系呢?
例如:酒店 --> 付款 --> 客户。

如果我做 Hotel hotel = Hotel.class.cast(session.merge(unmergeHotel)),付款和客户对象也会合并到会话中吗?

谢谢

4

1 回答 1

2

它是由您的关系的级联选项定义的。

  • 如果将关系配置为级联合并操作,则从被合并实体引用的实体也将被合并,以便在合并之前对这些实体所做的更改将传播到数据库。
  • 否则,这些实体将从数据库中重新加载,因此在合并之前对这些实体所做的任何更改都将被丢弃。
  • 未初始化的惰性关系将被忽略。

JPA规范的相关例外(我猜本地Hibernate的Session接口提供相同的语义):

  • cascade=MERGE对于由来自 X 的具有级联元素值or的关系引用的所有实体 Y cascade=ALL,Y 被递归地合并为 Y'。对于由 X 引用的所有此类 Y,X' 设置为引用 Y'。(请注意,如果 X 是托管的,则 X 是与 X' 相同的对象。)
  • 如果 X 是合并到 X' 的实体,并且引用另一个实体 Y,其中cascade=MERGE 或未cascade=ALL指定,则从 X' 导航相同关联会产生对具有与 Y 相同的持久标识的托管对象 Y' 的引用。

持久性提供程序不得合并标记为 LAZY 且尚未获取的字段:合并时必须忽略此类字段。

也可以看看:

于 2011-02-04T10:15:36.317 回答