当前位置: 首页 > 知识库问答 >
问题:

使用Spring JPA获取Hibernate会话

鲁宏爽
2023-03-14

我似乎无法让我的Spring JPA配置正常工作。我有一个Spring REST服务。如果我将所有实体设置为FetchType.EAGER,一切都按预期工作。但是我不想这样做,原因很明显。

当我将实体设置为FetchType时。懒惰,我得到以下错误:

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);
}

我很想过去!

共有1个答案

朱自明
2023-03-14

您需要使用此处引用的方法。

    @Entity
@NamedEntityGraph(name = "GroupInfo.detail",
  attributeNodes = @NamedAttributeNode("members"))
public class GroupInfo {

  // default fetch mode is lazy.
  @ManyToMany
  List<GroupMember> members = new ArrayList<GroupMember>();

  …
}

示例48.在存储库查询方法上引用命名实体图定义。

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

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

}

在上面的这个例子中,您需要在您想要急切加载特定关联的特定方法中标记成员。在上面的例子中,它是“成员”feild。

一般来说,所有的关联都标记为懒惰,并且您可以获取作为案例需求获取的关联,可以创建这样的特殊方法。例如,假设您有一个屏幕,其中包含客户的所有详细信息,因此在这样的VIEW中,您将拥有一种习惯方法,该方法可以急切地加载客户的所有地址,而对于其他视图,此地址可以保持懒惰,并且可以急切地加载其他东西。

当然有效,谢谢。

 类似资料:
  • 我仍然是java和spring的初学者,我已经在mysql中存储了一个名为< code>Offers的表,我试图逐行获取数据< code >其中Status == 0,我的表看起来像这样: 当我尝试运行我的代码时,它的返回 org.springframework.beans.factory。BeanCreationException:创建在类路径资源[org/springframework/boo

  • 我试图写这个来获取列表,我必须将ID列表作为参数传递: 我的实体是我用来查询的实体是: 但我在运行后遇到了以下异常: 有人能帮我用上面的方法获取列表吗?或者能告诉我我在这方面做错了什么。我不想使用本机,即(nativeQuery=true)使用这个。

  • 我创建了简单的Java应用程序来学习Spring和hibernate集成。我做了所有的设置和应用程序也工作良好。 一切正常。但是,我想看看我的应用程序当前使用了多少会话,比如打开的连接和关闭的hibernate连接。 在Sessionfactory类中,我们使用“getStatistics”方法来检索hibernate统计数据,但这对我没有帮助。它也给了我零分。请找到下面的图片。 http://w

  • 问题内容: 如何在Hibernate拦截器中获取Hibernate会话? 我正在尝试使用Hibernate通过组织ID透明地强制执行数据访问。我设置了一个全局筛选器,以按组织ID筛选所有查询。现在,在保存/更新之前,我需要使用实体拦截器在所有实体上设置组织ID。 组织ID来自HttpSession 我已经在Hibernate会话中将Organizational Id设置为Filter属性,我想在我

  • 我正在为实体对象上的延迟加载集合执行此操作: 我想返回一个实体对象,其中加载了多个延迟加载的集合,我可以这样做吗(传入一个列表并为单个条件设置多个关联?):

  • 我正在尝试使用Hibernate以便从MySQL数据库中获取数据。为了实现这样一个目标,我创造了: > Hibernate配置文件: