繁体   English   中英

即使在 HQL 查询中使用 Join Fetch,Hibernate 延迟初始化异常

[英]Hibernate Lazy Initialization exception even using Join Fetch in HQL queries

我想用延迟获取模式初始化一个集合并在我的查询中使用 Join Fetch 但我有时(并非总是)面临延迟初始化异常???

org.hibernate.LazyInitializationException:无法延迟初始化角色集合:xxx.entity.Product.producerEntities,无法初始化代理 - 没有会话...

例如这个查询:

"select p from Product p left join fetch p.producerEntities"

和我的坚持班:

    class Product
    {
        Set<Producer> producerEntities = new HashSet<>();
        ....
        @OneToMany(fetch = FetchType.LAZY)
        @JoinColumn(name="pid")
        public Set<Producer> getProducerEntities(){
         return producerEntities;
         }
    ....

}

我不明白有什么问题?

如果 join fetch 抛出 LIEX,那么我可以建议使用动态实体图,因为如果您需要定义特定于用例的图。

让我们试试这个,我做到了并为我工作。

public class DynamicEntityGraphDemo {

    public static void main(String[] args) {

        EntityManager em = HibernateUtil.getEntityManager();
        EntityGraph graph = em.createEntityGraph(Product.class);
        Subgraph itemGraph = graph.addSubgraph("producerEntities");

        Map hints = new HashMap();
        hints.put("javax.persistence.loadgraph", graph);

        Product pro = em.find(Product.class, 1, hints);
        System.out.println("DynamicEntityGraphDemo pro  = " + pro.toString() + 
                 "producer =  " + pro.getProducerEntities().toString());
    }
}

注意:动态实体图在检索子实体时使用 LEFT OUTER JOIN。 (子图 itemGraph = graph.addSubgraph("producerEntities");)

加入获取 p.producerEntities,而不是 p.producer..

问题来自我的集合 setter 和 getter 方法名称。 它解决了。

有很多方法可以解决,使用hibernate属性

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    return dataSource;
}

@Bean
public LocalSessionFactoryBean getSessionFactory() throws IOException {
    LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
    factoryBean.setDataSource(dataSource()); 

    Properties hibernateProperties = new Properties(); 
    hibernateProperties.setProperty("hibernate.enable_lazy_load_no_trans", "true"); 
    factoryBean.setHibernateProperties(hibernateProperties);
    factoryBean.afterPropertiesSet();

    return factoryBean;
}

@Bean
public HibernateTransactionManager getTransactionManager() throws IOException {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(getSessionFactory().getObject());
    return transactionManager;
}

或者你可以使用

org.hibernate.annotations.@Proxy 

@Entity
@Table(name = "ACTOR")
@Proxy(lazy = false)
public class Actor 

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM