gpt4 book ai didi

java - JPA OneToOne 惰性关系

转载 作者:行者123 更新时间:2023-12-01 11:06:49 25 4
gpt4 key购买 nike

我有 2 个实体:UserUserProfile,它们之间具有双向 @OneToOne 关系。
由于一些旧的数据库设计,UserProfile 是所有者(我在 users_profiles 表中有列 user_id)
这种关系是惰性的,因为我有 fetchType Lazy 和可选 = false。
一切都按预期工作,我的意思是当我加载 UserProfile 时,它​​也不会自动加载用户。我想这是完全正常的,因为我从所有者端加载。
我的问题是,如果我加载一个用户(拥有的一方),它会自动加载用户配置文件,尽管这种关系是惰性的。

我的意思是:当我从拥有方加载实体以加载所有者实体时,这正常吗?

@Entity
@Table(name = "users")
public class User extends BaseEntity implements Serializable {

@OneToOne(mappedBy = "user", optional=false, fetch = FetchType.LAZY)
private UserProfile profile;
// .................rest of entity
}




@Entity
@Table(name="users_profiles")
public class UserProfile extends BaseEntity implements Serializable {

@OneToOne(optional=false, fetch = FetchType.LAZY)
@JoinColumn(name="user_id")
private User user;
// ... rest of entity here
}

我测试的方法是使用 EntityManager 方法 find(id) 加载 User 实体。
我注意到,当关系不是惰性的时候,我只有一个查询,其中有一个连接。如果我输入当前设置,我有两个单独的查询:1 个用于用户,另一个用于个人资料。

最佳答案

重要的是要认识到,延迟加载行为不是由 JPA 规范强制执行的,只是建议这样做。由 hibernate 作为实现来选择是否支持以及在什么条件下支持。

Hibernate 通常会在请求时尽力延迟加载数据,但在一对一映射的情况下,当关系存储在另一个表中时(主键位于表 users_profiles),它还需要查询第二个表以检索主键来创建代理对象。事实上,它不仅仅检索 id,而是完整的行,并以急切的方式创建 UserProfile,因为在任何情况下需要连接表时,获取附加数据几乎不需要任何成本。

Hibernate: one-to-one lazy loading, optional = false 的答案表明使关系成为非可选应该使它变得懒惰,但我怀疑这是真的。 Hibernate 需要创建一个没有 ID 的代理,这在所有情况下都可能是正确的。失败的一种情况是,当您从父实体中的集合中删除代理对象,然后尝试读取其数据时 - 由于代理本身没有携带足够的信息来延迟检索数据,因此如果不连接到父实体,则不可能实体。

关于java - JPA OneToOne 惰性关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32869329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com