繁体   English   中英

关于JPA一对一延迟加载的问题

[英]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 值,那么为什么不只有一对一的关系做延迟加载呢?

AddressMember是一样的。 他们拥有代表该协会的列。 例如,表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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM