Java 为什么Hibernate(JPA)对多通关系忽略FetchType.LAZY?
我有一个实体,我想要一个多对一的关系Java 为什么Hibernate(JPA)对多通关系忽略FetchType.LAZY?,java,hibernate,jpa,many-to-one,Java,Hibernate,Jpa,Many To One,我有一个实体,我想要一个多对一的关系 @Entity public class Product { @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name = "atc_code_id") private ATCCode atcCode; } @Entity public class ATCCode { @OneToMany(mappedBy = "atcCode") private Set<Produc
@Entity
public class Product {
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "atc_code_id")
private ATCCode atcCode;
}
@Entity
public class ATCCode {
@OneToMany(mappedBy = "atcCode")
private Set<Product> products;
}
我的期望是返回atcCode的代理。只要我不访问atcCode,就不应该从DB加载它
知道hibernate为什么初始化代理吗
这是对问题的简单解释。实际上,我在产品上有很多多对一的关系。他们都被宣布为懒惰。但由于它们实际上是以平等的方式加载的,因此我得到了很大的select N+1性能损失。经过大量搜索,我最终在
org.hibernate.internal.SessionImpl
中设置了一个断点,其中生成了log语句初始化代理:
。沿着堆栈跟踪,我终于在产品中找到了这个:
@PostLoad
public void postLoad() {
atcCode.getCode();
}
这将导致hibernate初始化代理。这是否回答了您的问题?你还在试着让懒散加载工作,不是吗?它完美地回答了这个问题。postLoad使延迟加载解除限制无效,因为它强制hibernate初始化代理。好的。。。我只是想你可能想知道你如何才能压制这个电话。不幸的是,我认为这个答案对于那些看到这个问题的人来说是一个相当边缘的例子。我面临着同样的问题,我如何才能压制这个电话?
17925 07 Aug 2015 11:45:20 SQL DEBUG 352066 kb - select product0_.id ...
17926 07 Aug 2015 11:45:20 Loader DEBUG 348515 kb - Result set row: 0
17927 07 Aug 2015 11:45:20 Loader DEBUG 348515 kb - Result row: EntityKey[com.galexis.search.importer.search.searchdb.model.Product#1]
17928 07 Aug 2015 11:45:20 Loader DEBUG 348515 kb - Result set row: 1
17929 07 Aug 2015 11:45:20 Loader DEBUG 348515 kb - Result row: EntityKey[com.galexis.search.importer.search.searchdb.model.Product#2]
17929 07 Aug 2015 11:45:20 TwoPhaseLoad DEBUG 348515 kb - Resolving associations for [com.galexis.search.importer.search.searchdb.model.Product#1]
17931 07 Aug 2015 11:45:20 TwoPhaseLoad DEBUG 348515 kb - Done materializing entity [com.galexis.search.importer.search.searchdb.model.Product#1]
17931 07 Aug 2015 11:45:20 TwoPhaseLoad DEBUG 348515 kb - Resolving associations for [com.galexis.search.importer.search.searchdb.model.Product#2]
17931 07 Aug 2015 11:45:20 TwoPhaseLoad DEBUG 348515 kb - Done materializing entity [com.galexis.search.importer.search.searchdb.model.Product#2]
17931 07 Aug 2015 11:45:20 SessionImpl DEBUG 348515 kb - Initializing proxy: [com.galexis.search.importer.search.searchdb.model.ATCCode#100]
17931 07 Aug 2015 11:45:20 SQL DEBUG 348515 kb - select atccode0_.id ...
@PostLoad
public void postLoad() {
atcCode.getCode();
}