繁体   English   中英

休眠中一对一关联的延迟加载问题

[英]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.

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