【发布时间】:2015-09-12 19:10:30
【问题描述】:
我似乎无法让我的 Spring JPA 配置正常工作。我有一个 Spring REST 服务。如果我将所有实体设置为 FetchType.EAGER,一切都会按预期进行。但出于显而易见的原因,我不想这样做。
当我将实体设置为 FetchType.LAZY 时,我收到以下错误:
org.hibernate.LazyInitializationException: 延迟初始化失败 角色集合:com.service.entities.MyEntity.lawfirmCaseDecisions, 无法初始化代理 - 没有会话
我查看了其他类似的 SO 问题,但我仍然遇到同样的问题。这是我的配置:
@Configuration
@Import(EnvironmentProvider.class)
@EnableTransactionManagement
@Slf4j
public class DataSourceProvider {
@Autowired EnvironmentProvider envProvider;
@Bean
DataSource dataSource() {
final EnvConfig env = envProvider.envConfig();
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUrl(env.findProperty("db.url"));
dataSource.setPortNumber( Integer.parseInt(env.findProperty("db.port")) );
dataSource.setUser(env.findProperty("db.username"));
dataSource.setPassword(env.findProperty("db.password"));
return dataSource;
}
@Bean
LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPackagesToScan("com.offtherecord.service.core.entities");
//entityManagerFactoryBean.setPersistenceUnitName("OTR");
HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter();
entityManagerFactoryBean.setJpaVendorAdapter(va);
Properties ps = new Properties();
ps.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
// ps.put("hibernate.show_sql", "true"); //useful for debugging
ps.put("hibernate.format_sql", "true");
entityManagerFactoryBean.setJpaProperties(ps);
return entityManagerFactoryBean;
}
@Bean
@PersistenceContext
JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().nativeEntityManagerFactory);
return transactionManager;
}
}
为了快速测试,我在控制器方法上添加了@Transactional 注释。在下面的代码中,UserEntity 类有一个未填充的订单列表:
@RequestMapping(method = RequestMethod.GET)
@Transactional
public ResponseEntity<GetOrdersResponse> getOrders() {
UserEntity activeUser = controllerUtil.getActiveUser();
...
return new ResponseEntity<>(new GetOrdersResponse(), HttpStatus.OK);
}
我很想克服这个问题!
【问题讨论】:
-
除非您明确调用
userEntity.getOrders(),否则不会填充订单。如果还没有,您可以添加此方法调用并查看它的工作原理吗?
标签: java spring hibernate spring-data