我引用此链接https://developer.jboss.org/wiki/SomeExplanationsOnLazyLoadingone-to-one来了解为什么延迟加载不适用于one to one
,但适用于one to many
。
我不明白为什么SET对象永远不会出现如上所述的一对多的情况。有人可以解释一下吗?
我仍然不明白为什么延迟加载在one to many
中有效但在one to one
关联中无效。请解释。
答案 0 :(得分:0)
说实话,我直到现在才知道这一点,但这就是我理解那篇文章的原因。
对于@OneToMany
,Hibernate为集合创建了一个包装器,该包装器永远不会为null。所以,如果另一方没有数据,那么它只是一个空集,但仍然不是空的。
但是对于@OneToOne
包装器(代理)不能使用,因为getCee()
(来自那篇文章的例子)永远不会返回null,这是不对的。此属性的null
表示目标表中没有匹配的行,not null
表示存在。考虑到这一点,只有在关系是强制性的(constrained=true
)时,包装才有意义。
答案 1 :(得分:0)
这里重要的一点是,在实现一对多关系时,关系表示为一个Set,它是Hibernate为其提供实现的接口,而这个实现是实现延迟加载的实现。 / p>
但是,在一对一映射的情况下,Hibernate在任何时候都没有为主类与其一对一关系的任意类实现派生类。
答案 2 :(得分:-1)
一对一关系的默认提取类型是Eager,因此要更改此设置,您必须将字段注释为
@OneToOne(fetch=FetchType.LAZY)