![](/img/trans.png)
[英]LazyInitializationException: could not initialize proxy - no Session in Spring and Hibernate
[英]Vaadin Spring and Hibernate: could not initialize proxy - no Session
Model:
@Entity
...
public class ScolProgressionPopulation {
...
@OneToMany(mappedBy = "population")
private List<ScolProgressionSemestre> progressions;
...
}
回購:
public interface ScolProgressionPopulationRepository extends JpaRepository<ScolProgressionPopulation, Long>
風景:
@Route(value = "progression", layout = ApplicationLayout.class)
@RouteAlias(value = "", layout = ApplicationLayout.class)
public class ProgressionView extends Div {
public ProgressionView(@Autowired ScolProgressionPopulationRepository scolProgressionPopulationRepository) {
var items = scolProgressionPopulationRepository.findAll();
// I try this..
Hibernate.initialize(items);
// and this ...
Hibernate.initialize(items.get(0));
// this works:
System.out.println("this is ok:" +items.size());
// but not this:
System.out.println("err, could not initialize proxy - no Session :" +items.get(0).getProgressions().size());
我嘗試了很多方法來使延遲加載工作,(添加@Transactional,Hibernate.initialize ...)
但我總是以這個錯誤結束:
org.springframework.beans.factory.BeanCreationException:創建名為“nc.unc.scolarite.lmd.progression.gui.ProgressionView”的 bean 時出錯:通過構造函數實例化 Bean 失敗; 嵌套異常是 org.springframework.beans.BeanInstantiationException:無法實例化 [nc.unc.scolarite.lmd.progression.gui.ProgressionView]:構造函數拋出異常; 嵌套異常是 org.hibernate.LazyInitializationException:無法延遲初始化角色集合:nc.unc.scolarite.lmd.progression.entities.ScolProgressionPopulation.progressions,無法初始化代理 - 否 Session
PS:我不想使用EAGER fetch。 我想延遲加載數據。
您可以在您的存儲庫中創建一個新方法,該方法使用join fetch
來獲取相關實體,例如
@Query("SELECT spp FROM ScolProgressionPopulation spp JOIN FETCH spp.progressions")
public List<ScolProgressionPopulation> findAllWithProgressions();
另一種方法是將@Transactional
注釋添加到存儲庫中的方法(那么它不能是接口),它也可能適用於您視圖中的方法。 您可能需要為所有進程 collections 調用initialize
,這不是很有效,因為它可能會創建許多數據庫查詢。
@Transactional
public List<ScrolProgressionPopulation> findAllWithProgressions() {
val spps = findAll();
for(ScrolProgressionPopulation spp: spps) {
Hibernate.initialize(spp.getProgressions();
}
return spps;
}
編輯:如果你不想初始化所有項目,你可以做這樣的事情
@Transactional
public void initializeProgressions(ScrolProgressionPopulation spp) {
Hibernate.initialize(spp.getProgressions());
}
並按需調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.