Java 关于JPA一对一延迟加载的问题
我知道,如果在一对一的关系中有双向关系,那么惰性加载是不可能完成的 所以我读到了 这篇文章说你不能在一对一的关系中创建代理,但我不能完全理解 我认为多对一关系和一对一关系没有区别。他说,在多对一关系中,您可以创建代理,因为您可以从FK获得值 但是,一对一关系也可以获得值对于FK,没有解释为什么一对一的关系不能只获得值 有人能解释清楚吗Java 关于JPA一对一延迟加载的问题,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我知道,如果在一对一的关系中有双向关系,那么惰性加载是不可能完成的 所以我读到了 这篇文章说你不能在一对一的关系中创建代理,但我不能完全理解 我认为多对一关系和一对一关系没有区别。他说,在多对一关系中,您可以创建代理,因为您可以从FK获得值 但是,一对一关系也可以获得值对于FK,没有解释为什么一对一的关系不能只获得值 有人能解释清楚吗 //一对一 班级地址{ .. @OnetoOne(fetch=LAZY) @列(~) 私人秩序; } 阶级秩序{ .. @OnetoOne(mappedBy=
//一对一
班级地址{
..
@OnetoOne(fetch=LAZY)
@列(~)
私人秩序;
}
阶级秩序{
..
@OnetoOne(mappedBy=order,fetch=LAZY)
私有地址;//不是wokring
}
//多通
公共班级成员{
@manytone(fetch=LAZY)
@JoinColmn(~)
公共团队;//懒惰的工作!
}
我认为这两个是不同的。我知道PK值同样,为什么不只有一对一关系进行延迟加载呢?
地址
和成员
是相同的。他们拥有代表协会的列。比如说,表成员中的列team\u id
和表地址中的列order\u id
当Hibernate ORM从表Member
中读取一行时,通过检查team\u id
列的值,它知道该值是否为null或是否存在关联。因此,在创建实体时,它可以决定映射关联的值(mapping#team
)是null还是代理。在这种情况下,延迟抓取是可能的
表Order
没有表示关联的列,这是因为关联由Address
中的列Order\u id
映射。当Hibernate ORM需要将表Order
中的行转换为实体时,它还需要检查表Address
以查看是否存在关联。根据结果,它会将值Order#address
设置为null或相关地址。在这种情况下,如果不检查表地址
,它就无法知道关联的值是否为null:不可能进行延迟获取
请注意,当映射声明关联从不为null时,仍然可以延迟获取关联:@OneToOne(mappedBy=“order”,optional=false)
基本上,问题是如果一个值可以映射为null,Hibernate ORM需要首先检查该值是否实际为null,否则,如果(order.address==null){
这样的代码在创建代理时将不起作用
Empty*-在这方面,许多关联都是不同的,因为Hibernate ORM将它们映射为一个空集合(并且从不使用null),这意味着它可以始终返回代理。很晚,但我还有一个问题。公共类团队{@OneToMany(fetch=LAZY)@JoinColmn(~)public List members;//LAZY working!}在您所说的示例中,团队也不知道成员。但在这里延迟加载起作用。区别是什么?这是一个集合。Hibernate ORM从不为集合返回null,因此总是可以返回代理。基本上,当值可以为null时,问题就发生了,因为如果Hibernate ORM返回代理,则会检查if(order.address==null){
不起作用。