Org.hibernate.LazyInitializationException в весенних данных jpa

Я встретил 'org.hibernate.LazyInitializationException: could not initialize proxy - no Session' в весенних данных jpa.

Ниже мой код.

    // this is service layer
    @Transactional(rollbackFor = Exception.class)
    public BlogEntity saveBlog(BlogEntity blogEntityInput) {
        BlogEntity blogEntity = blogDao.find(blogEntityInput.getId());
        System.out.println(blogEntity);
        return blogDao.saveBlog(blogEntityInput);
    }

   // this is dao layer which will call
   @Override
   public BlogEntity find(Integer id) {
    return blogRepository.getOne(id); // JpaRepository#getOne
   }

Исключение возникает, когда я печатаю blogEntity после вызова получить один. Я знаю, что получить один загружается лениво. Но я уже добавил @транзакционный, который гарантирует, что внутренний метод будет находиться в сеансе гибернации. Как могло произойти LazyInitializationException?

Спасибо.

Ниже приведен мой полный весенний код, связанный с базой данных.

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "h2_entityManagerFactory",
  basePackages = { "com.taobao.rest.repository.h2" },
        transactionManagerRef = "h2_manager"

)
public class H2DBConfig {

  @Primary
  @Bean(name = "h2_dataSource")
  public DataSource dataSource(){
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setDriverClassName("org.h2.Driver");
      dataSource.setUrl("jdbc:h2:~/new-taobao");
      dataSource.setUsername("taobao");
      dataSource.setPassword("");

      return dataSource;
  }

  @Primary
  @Bean(name = "h2_entityManagerFactory")
  public LocalContainerEntityManagerFactoryBean h2EntityManagerFactory() {
      LocalContainerEntityManagerFactoryBean em
              = new LocalContainerEntityManagerFactoryBean();
      em.setDataSource(dataSource());
      em.setPackagesToScan(new String[] { "com.taobao.rest.entity.h2" });
      em.setPersistenceUnitName("h2_unit");
      JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
      em.setJpaVendorAdapter(vendorAdapter);
      em.setJpaProperties(additionalProperties());

      return em;
  }

  Properties additionalProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "update");
        properties.setProperty(
                "hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        properties.setProperty("hibernate.show_sql", "true");
        return properties;
    }


    @Bean(name = "h2_manager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("h2_entityManagerFactory") EntityManagerFactory emf){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }
}

Добавьте код вашего объекта BlogEntity. Как я думаю, в этом объекте есть ссылка на какой-то другой объект, который при вызове метода печати пытается получить доступ к этому объекту, и он не загружается с помощью метода findOne BlogEntity .

Jaspreet Jolly 20.02.2019 07:58

Можете ли вы вставить полный сервис и прокомментировать место, где возникает ошибка?

Andronicus 20.02.2019 08:09

откуда ты звонишь saveBlog? Если это тот же класс, вызов не будет проходить через прокси-сервер, выполняющий обработку транзакции, и вы получите транзакцию, которая охватывает только вызов репозитория. См. эти вопросы и ответы, включая комментарии: stackoverflow.com/questions/32156652/…

Jens Schauder 20.02.2019 08:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
208
0

Другие вопросы по теме