Java 为什么延迟加载在一对一关联中不起作用?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21499580/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Why Lazy loading not working in one to one association?
提问by M Sach
@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
}
when i do
当我做
Person person1=(Person)session.get(Person.class, 1);
i see two queries being fired. one for fetching person data and another for person detail data.
我看到两个查询被触发。一个用于获取个人数据,另一个用于获取个人详细信息。
As per my understanding only 1 query should have been fired that is for fetching person data not for person detail data as i have mentioned lazy loading. Why personDetail data is getting fetched along with person data ?
根据我的理解,只有 1 个查询应该被触发,用于获取个人数据而不是个人详细信息数据,正如我提到的延迟加载。为什么 personDetail 数据与 person 数据一起被获取?
采纳答案by gipinani
Hibernate cannot proxy your own object as it does for Sets / Lists in a @ToMany
relation, so Lazy loading does not work.
Hibernate 不能代理您自己的对象,因为它为@ToMany
关系中的 Sets/Lists所做的那样,因此延迟加载不起作用。
I think this link could be useful to understand your problem: http://justonjava.blogspot.co.uk/2010/09/lazy-one-to-one-and-one-to-many.html
我认为此链接可能有助于了解您的问题:http: //justonjava.blogspot.co.uk/2010/09/lazy-one-to-one-and-one-to-many.html
回答by Sean Mickey
Based on your comment and since the PersonDetail
entity contains a foreign key column that references the Person
entity, it looks like you only have 1 problem:
根据您的评论,并且由于PersonDetail
实体包含引用实体的外键列Person
,因此您似乎只有 1 个问题:
Entity relationships include the concept of a relationship owner(in this case PersonDetail
), which means that you want to add a @JoinColumn
annotation in the PersonDetail
entity.
实体关系包括关系所有者的概念(在本例中为PersonDetail
),这意味着您要@JoinColumn
在PersonDetail
实体中添加注释。
You have already correctly defined the inverse side of the relationship (the entity that is not the ownerof the relationship) with the mappedBy
attribute that was added to the association annotation (@OneToOne
in your case) to make the relationship bi-directional, which means that the associated PersonDetail
may be reached from a Person
instance.
您已经使用添加到关联注释(在您的情况下)的属性正确定义了关系的反面(不是关系所有者的实体)以使关系双向,这意味着可以从实例访问相关联。mappedBy
@OneToOne
PersonDetail
Person
Given the relationship that is clarified in your comment, you should only have to make 1 change to your code as shown here:
鉴于您在评论中阐明的关系,您只需对代码进行 1 处更改,如下所示:
@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...
}