[英]Issue about JPA One to One Lazy Loading
我知道如果您在一对一关系中有双向关系,则无法完成延迟加载。
所以我读到了如何使 JPA OneToOne 关系变得懒惰。
文章说不能在一对一的关系中创建代理,但是我不太明白。
我认为多对一关系和一对一关系没有区别。 他说,在多对一关系中,您可以创建代理,因为您可以从 FK 获得价值。
但是,一对一的关系也可以通过 FK 获取值,没有解释为什么一对一的关系不能只获取值。
有人可以解释清楚吗?
// one to one
class Address {
..
@OnetoOne(fetch = LAZY)
@JoinColumn(~)
private Order order;
}
class Order {
..
@OnetoOne(mappedBy = order, fetch = LAZY)
private Address address; // LAZY not wokring
}
// ManyToOne
public class Member {
@ManyToOne(fetch = LAZY)
@JoinColmn(~)
public Team team; // LAZY working!
}
我认为这两个是不同的。 我同样知道 PK 值,那么为什么不只有一对一的关系做延迟加载呢?
Address
和Member
是一样的。 他们拥有代表该协会的列。 例如,表Member
中的列team_id
和表Address
中的列order_id
。
当 Hibernate ORM 从表Member
中读取一行时,通过检查team_id
列的值,它知道该值是 null 还是存在关联。 因此,当创建实体时,它可以决定映射关联( Mapping#team
)的值是 null 还是代理。 在这种情况下,延迟获取是可能的。
表Order
没有表示关联的列,这是因为关联由Address
中的列order_id
映射。 当Hibernate ORM需要将表Order
中的一行转换为实体时,还需要检查表Address
是否存在关联。 根据结果,它将值Order#address
设置为 null 或相关地址。 在这种情况下,如果不检查表Address
,则无法知道关联的值是否为 null:无法进行延迟获取。
请注意,当映射声明关联永远不是 null: @OneToOne(mappedBy="order", optional=false)
时,仍然可以延迟获取关联。
Basically, the problem is that if a value can be mapped to null, Hibernate ORM needs to check first if this value is actually null because, otherwise, code like if (order.address == null) {
is not going to work if a代理已创建。
空 * 对多关联在这方面是不同的,因为 Hibernate ORM 将它们映射为空集合(从不使用 null),这意味着它始终可以返回代理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.