Java 为什么延迟加载不能在一对一关联中工作?
当我这样做的时候Java 为什么延迟加载不能在一对一关联中工作?,java,hibernate,lazy-loading,Java,Hibernate,Lazy Loading,当我这样做的时候 @Entity public class Person { @Id @GeneratedValue private int personId; @OneToOne(cascade=CascadeType.ALL, mappedBy="person", fetch=FetchType.LAZY) private PersonDetail personDetail; //getters and setters } @Entity
@Entity
public class Person {
@Id
@GeneratedValue
private int personId;
@OneToOne(cascade=CascadeType.ALL, mappedBy="person", fetch=FetchType.LAZY)
private PersonDetail personDetail;
//getters and setters
}
@Entity
public class PersonDetail {
@Id
@GeneratedValue
private int personDetailId;
@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
private Person person;
//getters and setters
}
我看到有两个问题被提出。一个用于获取人员数据,另一个用于获取人员详细信息数据
据我所知,应该只触发1个查询,用于获取个人数据,而不是我提到的个人详细信息数据
延迟加载。为什么personDetail数据会与person数据一起被提取?Hibernate无法代理您自己的对象,就像它代理
@ToMany
关系中的集合/列表一样,因此延迟加载不起作用
我认为此链接有助于理解您的问题:根据您的评论,由于
PersonDetail
实体包含一个引用Person
实体的外键列,您似乎只有一个问题:
实体关系包括关系所有者的概念(在本例中为PersonDetail
),这意味着您希望在PersonDetail
实体中添加@JoinColumn
注释
您已经使用添加到关联注释(@OneToOne
)的mappedBy属性正确定义了关系的反面(不是关系所有者的实体),以使关系具有双向性,这意味着关联的persondeail
可以从Person
实例访问
考虑到注释中阐明的关系,您只需对代码进行1次更改,如下所示:
Person person1=(Person)session.get(Person.class, 1);
根据你问题中的代码,我猜Person实体的支持表包含一个引用PersonDetail实体的外键列。如果这是正确的,那么看起来你有两个问题:“另一个问题。”。好的,我已经根据你的评论更新了我的答案。我认为添加@JoinColumn注释是您需要更改的全部内容。@MSach我已经更新了我的答案,以便与您评论中的信息保持一致。如果您的问题是用您引用的其他SO问题回答的,您可能希望删除此问题或发布您自己引用该问题的答案。通过这种方式,它仍然会对其他在寻求类似问题帮助时找到解决此问题的方法的人有所帮助。我认为@JoinColumn注释甚至没有必要,除非您需要为它提供诸如nullable=false、updateable=false等道具。JPA已经可以看出它不是@Basic列。。。因此@JoinColumn注释可能不会起任何作用。
@Entity
public class Person {
@Id
@GeneratedValue
private int personId;
//Retain the mappedBy attribute here:
@OneToOne(cascade=CascadeType.ALL, mappedBy="person",
fetch=FetchType.LAZY)
private PersonDetail personDetail;
//getters and setters...
}
@Entity
public class PersonDetail {
@Id
@GeneratedValue
private int personDetailId;
@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
//Change: add the @JoinColumn annotation here:
@JoinColumn(name="PERSON_FK_COLUMN")
private Person person;
//getters and setters...
}