Я встретил '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;
}
}
Можете ли вы вставить полный сервис и прокомментировать место, где возникает ошибка?
откуда ты звонишь saveBlog? Если это тот же класс, вызов не будет проходить через прокси-сервер, выполняющий обработку транзакции, и вы получите транзакцию, которая охватывает только вызов репозитория. См. эти вопросы и ответы, включая комментарии: stackoverflow.com/questions/32156652/…




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