簡體   English   中英

Vaadin Spring 和 Hibernate:無法初始化代理 - 否 Session

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM