Hibernate为何在设置子实体关联属性时自动添加至父实体集合?
问题原因解析
这是Hibernate双向关联的自动同步机制在起作用,和方法调用顺序直接相关:
- 当调用
token.setUser(this)时,Hibernate会识别这是双向关联的子端设置父端操作,它会自动把该token实例同步到User的authenticationTokens集合中——这是Hibernate为维护双向关联一致性内置的逻辑。 - 第一种写法
authenticationTokens.add( token.setUser(this) )相当于:先触发Hibernate自动将token加入集合,紧接着你又手动调用add方法再添加一次,最终集合里就会出现重复的token。
而第二种写法的顺序刚好规避了重复:
- 先手动把token加入
authenticationTokens集合 - 再调用
token.setUser(this),此时Hibernate会检查User的集合里已经存在该token实例,就不会执行自动同步的添加操作,因此不会出现重复。
另外需要注意:即使移除@Transactional注解,现象依然存在,因为Hibernate的双向关联同步逻辑是在实体对象的内存层面执行的,和事务上下文无关——只要使用了Hibernate的实体关联映射,这个内置同步行为就会生效。
内容的提问来源于stack exchange,提问作者Arash
相关产品推荐
相关产品推荐

