简体   繁体   English

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

[英]Vaadin Spring and Hibernate: could not initialize proxy - no Session

The Model: Model:

    @Entity
    ...
    public class ScolProgressionPopulation {    
       ...        
        @OneToMany(mappedBy = "population")
        private List<ScolProgressionSemestre> progressions;        
       ...
    }

The repo:回购:

    public interface ScolProgressionPopulationRepository extends JpaRepository<ScolProgressionPopulation, Long>

The View:风景:

    @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());

I try many thing to make lazy loading work, (adding @Transactional, Hibernate.initialize...)我尝试了很多方法来使延迟加载工作,(添加@Transactional,Hibernate.initialize ...)

But I always end up with this error:但我总是以这个错误结束:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nc.unc.scolarite.lmd.progression.gui.ProgressionView': Bean instantiation via constructor failed; org.springframework.beans.factory.BeanCreationException:创建名为“nc.unc.scolarite.lmd.progression.gui.ProgressionView”的 bean 时出错:通过构造函数实例化 Bean 失败; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [nc.unc.scolarite.lmd.progression.gui.ProgressionView]: Constructor threw exception;嵌套异常是 org.springframework.beans.BeanInstantiationException:无法实例化 [nc.unc.scolarite.lmd.progression.gui.ProgressionView]:构造函数抛出异常; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: nc.unc.scolarite.lmd.progression.entities.ScolProgressionPopulation.progressions, could not initialize proxy - no Session嵌套异常是 org.hibernate.LazyInitializationException:无法延迟初始化角色集合:nc.unc.scolarite.lmd.progression.entities.ScolProgressionPopulation.progressions,无法初始化代理 - 否 Session

PS: I don't want to use EAGER fetch. PS:我不想使用EAGER fetch。 I want to lazy load the data.我想延迟加载数据。

You could create a new method in your repository that uses join fetch to fetch the related entities, something like您可以在您的存储库中创建一个新方法,该方法使用join fetch来获取相关实体,例如

@Query("SELECT spp FROM ScolProgressionPopulation spp JOIN FETCH spp.progressions")
public List<ScolProgressionPopulation> findAllWithProgressions();

Another way is to add the @Transactional annotation to a method in your repository (then it can't be an interface), it might also work on a method in your view.另一种方法是将@Transactional注释添加到存储库中的方法(那么它不能是接口),它也可能适用于您视图中的方法。 You probably need to call initialize for all progression collections, which is not very efficient as it may create many DB queries.您可能需要为所有进程 collections 调用initialize ,这不是很有效,因为它可能会创建许多数据库查询。

@Transactional
public List<ScrolProgressionPopulation> findAllWithProgressions() {
    val spps = findAll();
    for(ScrolProgressionPopulation spp: spps) {
        Hibernate.initialize(spp.getProgressions();
    }
    return spps;
}

Edit: If you don't want to initialize all items, you can do something like this编辑:如果你不想初始化所有项目,你可以做这样的事情

@Transactional
public void initializeProgressions(ScrolProgressionPopulation spp) {
    Hibernate.initialize(spp.getProgressions());
}

and call this on demand.并按需调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 LazyInitializationException:无法初始化代理-Spring和Hibernate中没有会话 - LazyInitializationException: could not initialize proxy - no Session in Spring and Hibernate Spring MVC + Hibernate:无法初始化代理 - 没有Session - Spring MVC + Hibernate: could not initialize proxy - no Session Hibernate / Spring3:无法初始化代理 - 没有Session - Hibernate/Spring3: could not initialize proxy - no Session 无法初始化代理-没有会话(春季休眠一对一) - could not initialize proxy - no Session (Spring-Hibernate-one to one) Spring JPA - org.hibernate.LazyInitializationException:无法初始化代理 - 无 Z71AB3B3AE294B3ABDE46 - Spring JPA - org.hibernate.LazyInitializationException: could not initialize proxy - no Session Spring DATA JPA + Hibernate-无法初始化代理-修复后无会话: - Spring DATA JPA + Hibernate - could not initialize proxy - no Session after fix: Hibernate中的LazyInitializationException:无法初始化代理 - 没有Session - LazyInitializationException in Hibernate : could not initialize proxy - no Session 休眠延迟异常无法初始化代理-无会话 - hibernate lazy exception could not initialize proxy - no Session Hibernate 4 + Spring Data CrudRepository,CLI应用程序:无法延迟初始化集合:无法初始化代理-没有会话 - Hibernate 4 + Spring Data CrudRepository, CLI application: failed to lazily initialize a collection: could not initialize proxy - no Session Hibernate 延迟加载不适用于 Spring 启动 =&gt; 无法延迟初始化角色集合无法初始化代理 - 没有 Session - Hibernate Lazy loading not working with Spring Boot => failed to lazily initialize a collection of role could not initialize proxy - no Session
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM