Исключение отложенной инициализации Hibernate, даже при использовании Join Fetch в HQL-запросах - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу инициализировать коллекцию в режиме отложенной выборки и использовать 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;
         }
    ....

}

Я не понимаю, в чем проблема?

Ответы [ 4 ]

0 голосов
/ 06 августа 2019

есть много способов решить, используя свойства гибернации

@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 
0 голосов
/ 06 сентября 2018

присоединиться к p.producerEntities, а не к p.producer ..

0 голосов
/ 16 января 2019

Проблема была из моего метода установки и получения методов получения. Это решено.

0 голосов
/ 06 сентября 2018

Если при соединении выборка вызывает LIEX, тогда я мог бы предложить использовать Dynamic Entity Graph, потому что если вам нужно определить график для конкретного случая использования.

Давайте попробуем это, я сделал и работаю для меня.

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 при извлечении дочерней сущности. (Subgraph itemGraph = graph.addSubgraph ("providerEntities");)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...