[英]Lazy loading issue with One to one association in hibernate
我有一个与延迟加载OneToOne
关联映射有关的问题。
情况1外键在子表(地址)中
@Entity
public class User {
..........
@OneToOne(mappedBy="user")
private Address address;
@Entity
public class Address{
.........
@OneToOne
@JoinColumn(name = "user_id")
private User user;
在上述地址中,延迟加载无效。
情况2外键在父表中(用户)
@Entity
public class User {
.............
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="address_id")
private Address address;
@Entity
public class Address {
........
@OneToOne(mappedBy="address")
private User user;
在上面的地址中,延迟加载有效。
能否请某人解释一下为什么One to one
延迟加载在第一种情况下不起作用,而在第二种情况下起作用?
@OneToOne
有点棘手。
这完全取决于您使用的持久性提供程序。
某些提供程序不尊重FetchType.LAZY
提示。
您可以尝试指定(在关系的两端)
@OneToOne(optional = true, fetch = FetchType.LAZY)
要了解此处发生的情况,请看一下级别:
第一种情况:
+-----------------+ +------------------+
| USER | | Address |
| |1 1| |
| +-------------+ USER_ID (FK) |
| | | |
| | | |
+-----------------+ +------------------+
加载用户时,Hibernate必须知道该地址是否存在。
因此,Hibernate发出类似于以下内容的SQL请求:
SELECT * FROM USER WHERE ID = ?
SELECT * FROM ADDRESS WHERE user_id = ?
获取结果时,该实体已经加载,因此没有必要将LazyProxy分配给该地址。 Hibernate分配获取的对象。
第二种情况:
+-----------------+ +------------------+
| USER | | Address |
| |1 1| |
| ADDRESS_ID +-------------+ |
| | | |
| | | |
+-----------------+ +------------------+
SELECT * FROM USER WHERE ID = ?
Hibernate不需要检查该地址是否存在。 这就是创建代理的原因。
我一直无法使其工作,所以我使用了一条准备好的语句,在其中我JOIN FETCH
了Hibernate事后查询的内容。
IMO,添加optional=true
或伪造OneToMany
关系是错误的解决方法。
阅读本文。 它将使您理解为什么“反面”(由映射)属性一对一无法按预期工作。 一对一懒惰的解释 。
实际上,在休眠状态下,休眠状态需要知道映射的值是什么,因为用户可以立即请求值。
阅读本文,您将清楚地了解事情的运作方式。
谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.