Java 使用Spring JPA获取Hibernate会话

Java 使用Spring JPA获取Hibernate会话,java,spring,hibernate,spring-data,Java,Spring,Hibernate,Spring Data,我似乎无法让我的Spring JPA配置正常工作。我有春假服务。如果我将所有实体都设置为FetchType.EAGER,那么一切都会按预期进行。但我不想这么做,原因很明显 当我将实体设置为FetchType.LAZY时,出现以下错误: org.hibernate.LazyInitializationException:延迟初始化失败 角色集合:com.service.entities.MyEntity.lawfirmCaseDecisions, 无法初始化代理-没有会话 我已经研究了其他类似的S

我似乎无法让我的Spring JPA配置正常工作。我有春假服务。如果我将所有实体都设置为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);
}
@RequestMapping(method=RequestMethod.GET)
@交易的
公共响应性命令(){
UserEntity activeUser=controllerUtil.getActiveUser();
...
返回新的ResponseEntity(new GetOrdersResponse(),HttpStatus.OK);
}

我很想过去

您需要使用这样的方法

@实体
@NamedEntityGraph(name=“GroupInfo.detail”,
attributeNodes=@NamedAttributeNode(“成员”))
公共类组信息{
//默认的获取模式是惰性的。
@许多
列表成员=新的ArrayList();
…
}
例48。在存储库查询方法上引用命名实体图定义

@Repository
public interface GroupRepository extends CrudRepository<GroupInfo, String> {

  @EntityGraph(value = "GroupInfo.detail", type = EntityGraphType.LOAD)
  GroupInfo getByGroupName(String name);

}
@存储库
公共接口GroupRepository扩展了Crudepository{
@EntityGraph(value=“GroupInfo.detail”,type=EntityGraphType.LOAD)
GroupInfo getByGroupName(字符串名称);
}
在上面的示例中,您需要标记特定方法中的成员,您希望在该方法中加载特定关联。在上面的例子中,它是“members”feild

一般来说,所有的关联都被标记为lazy,并且可以获取您希望作为案例需求获取的关联,这样就可以创建特殊的方法。例如,假设您有一个屏幕,其中有客户的所有详细信息,因此在这样一个视图中,您将使用acustom方法,该方法急切地加载客户的所有地址,而对于其他视图,该地址可以保持惰性,而其他一些地址可以急切地加载

当然有效,
谢谢。

除非您显式调用
userEntity.getOrders()
,否则不会填充订单。如果尚未添加此方法调用,您是否可以添加此方法调用并查看其是否有效?
@Repository
public interface GroupRepository extends CrudRepository<GroupInfo, String> {

  @EntityGraph(value = "GroupInfo.detail", type = EntityGraphType.LOAD)
  GroupInfo getByGroupName(String name);

}