Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于JPA一对一延迟加载的问题_Java_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

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

Java 关于JPA一对一延迟加载的问题,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,我知道,如果在一对一的关系中有双向关系,那么惰性加载是不可能完成的 所以我读到了 这篇文章说你不能在一对一的关系中创建代理,但我不能完全理解 我认为多对一关系和一对一关系没有区别。他说,在多对一关系中,您可以创建代理,因为您可以从FK获得值 但是,一对一关系也可以获得值​​对于FK,没有解释为什么一对一的关系不能只获得值 有人能解释清楚吗 //一对一 班级地址{ .. @OnetoOne(fetch=LAZY) @列(~) 私人秩序; } 阶级秩序{ .. @OnetoOne(mappedBy=

我知道,如果在一对一的关系中有双向关系,那么惰性加载是不可能完成的

所以我读到了

这篇文章说你不能在一对一的关系中创建代理,但我不能完全理解

我认为多对一关系和一对一关系没有区别。他说,在多对一关系中,您可以创建代理,因为您可以从FK获得值

但是,一对一关系也可以获得值​​对于FK,没有解释为什么一对一的关系不能只获得值

有人能解释清楚吗

//一对一
班级地址{
..
@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){
不起作用。