我知道懒加载是做不到的,如果你在一对一的关系中有双向的关系。
所以我读了一篇关于如何使JPA OneToOne关系变懒的文章。
文章说你不能在一对一的关系中创建代理,但我不太理解。
我觉得多对一的关系和一对一的关系没有什么区别。他说,在多对一的关系中,您可以创建一个代理,因为您可以从fk获得值。
// one to one
class Address {
..
@OnetoOne(fetch = LAZY)
@JoinColumn(~)
private Order order;
}
class Order {
..
@OnetoOne(mappedBy = order, fetch = LAZY)
private Address address; // LAZY not wokring
}
// ManyToOne
public class Member {
@ManyToOne(fetch = LAZY)
@JoinColmn(~)
public Team team; // LAZY working!
}
我觉得这两个是不一样的。我知道PK值相等,那么为什么不只有一对一的关系做懒加载呢?
地址
和成员
是相同的。他们拥有代表该协会的列。例如,我们假设表member
中的列team_id
和表address
中的列order_id
。
当Hibernate ORM从表member
中读取一行时,通过检查team_id
列的值,它知道该值是否为null或是否存在关联。因此,当创建实体时,它可以决定映射关联的值(mapping#team
)是null还是代理。在这种情况下,可以进行惰性提取。
表order
没有表示关联的列,这是因为关联是由address
中的列order_id
映射的。当Hibernate ORM需要将表order
中的一行转换为实体时,它还需要检查表address
以查看是否存在关联。根据结果,它将值order#address
设置为null或关联地址。在这种情况下,如果不检查表address
,它就无法知道关联的值是否为空:惰性提取是不可能的。
注意,当映射声明关联永远不为空时,仍然可以延迟提取关联:@OneToOne(MappedBy=“order”,optional=false)
。
请注意,我已经看过类似的问题,我已经解释了为什么它们对我不起作用 我有一个简单Spring boot JPA-Hibernate应用程序,它具有用户和地址之间的一对一映射。(请注意,我对一对多映射没有这个问题) 用户实体 员额1 我还读到spring.jpa.open-in-view defualt值可能是罪魁祸首: 员额2 通过将添加到我的中,我禁用了默认的“在视图中打开”属性 我假设这是因为J
默认情况下,Hibernate支持一对多/多对一和多对多关联的惰性加载。但Hibernate不支持一对一关系的延迟加载。让我们为父场景和子场景提供以下示例。 一个人有一个地址父实体定义为。 子实体定义为 在上面的场景中,它应该是惰性加载,但实际上hibernate正在产生急切的加载。两个select语句同时激发1)select用于父实体,在本例中为Person;2)select用于子实体,在本例中
我试着调整我的应用程序,所以我把关系变成懒惰的,只取我需要的东西 我的多对一关系有一个问题,当我再次加载实体时转到lazy时,Hibernate将实体替换为代理,即使我获取了该实体,而该代理在应用程序的视图部分(JSF)中不工作。当多对一处于急切模式时,问题就会消失,但hibernate会为每个多对一执行一个select more(选择更多),即使我不需要它们 1/ 2/ JPQL查询: =>两次
我在数据库中有两个表一对一的关系: 我必须使用来编写Java实体类: 客户端类: 占有实体: 我有一个klientMB,它添加了人和地址 但是当我尝试添加一个Klient时,我出现了这个错误:
问题内容: 我有一个关于JPA-2.0(提供者为Hibernate)关系及其在Java中的相应管理的问题。假设我有一个Department和一个Employee实体: 现在,我知道我必须自己管理Java关系,如以下单元测试所示: 如果我遗漏任何一个,否则断言将失败。到目前为止,一切都很好。如果我在两者之间提交数据库事务该怎么办? 我还需要管理双方关系吗?不,事实证明,我不必这样做。有了这个修改 这
我有一个JAX-RS资源类。它调用一个加载实体的无状态EJB(我们称之为)。 与另一个实体具有关系(我们称之为),并且配置为具有的提取类型。 任何东西上都不会出现额外的事务性注释,因此无状态EJB的默认行为是在必要时启动事务,并在事务的业务方法完成后提交事务。 在调试器中,我观察到EJB返回的将作为的值,正如我所怀疑的那样。因此,惰性加载工作良好。 然后,我的资源类构建一个并将控制权交给JAX-R