在 Spring Boot 2.0 / Hibernate 5 中获取 SessionFactory

2023-12-04

我正在使用HibernateJpaSessionFactoryBean在 Spring Boot 1.5.x 中为我的会话获取会话工厂 bean。由于现在已弃用,我尝试通过在 EntityManagerFactory 中展开来使用会话工厂。但是,我无法让 EntityManagerFactory 自动装配。没有 bean 定义它。

我需要做什么才能连接 EntityManagerFactory? entityManagerFactory 保持为空。

/**
 * A class to hold necessary data access beans.
 */
@Configuration
@EnableTransactionManagement
public class DataBeans {

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    /**
     * This bean needs to be wired in so that a SessionFactory can be wired in to other data access beans.
     *
     * @return a session factory bean
     */
    @Bean
    public SessionFactory sessionFactoryProvider() {
        return entityManagerFactory.unwrap(SessionFactory.class);
    }
}



@SpringBootApplication
public class AppBootMain {
    public static void main(String[] args) {
        SpringApplication.run(AppBootMain.class, args);
    }
}

应用程序属性:

spring.datasource.driverClassName=org.hsqldb.jdbc.JDBCDriver
spring.datasource.url=jdbc:hsqldb:mem:student_db
spring.datasource.username=sa
spring.datasource.password=

spring.jpa.database-platform=org.hibernate.dialect.HSQLDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=create-drop

# this ensures that a session factory bean is available
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext

注意:我尝试更改current_session_context_class在包中指定hibernate5,但没有成功。

运行 bootRun 时出错: ````

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dataBeans': Unsatisfied dependency expressed through field 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactoryProvider' defined in class path resource [org/webapp/example/school/data/repository/DataBeans.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.hibernate.SessionFactory]: Circular reference involving containing bean 'dataBeans' - consider declaring the factory method as static for independence from its containing instance. Factory method 'sessionFactoryProvider' threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:587)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:373)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1348)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:578)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$94/681094281.getObject(Unknown Source)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)
    at org.webapp.example.school.AppBootMain.main(AppBootMain.java:27)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactoryProvider' defined in class path resource [org/webapp/example/school/data/repository/DataBeans.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.hibernate.SessionFactory]: Circular reference involving containing bean 'dataBeans' - consider declaring the factory method as static for independence from its containing instance. Factory method 'sessionFactoryProvider' threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:587)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1254)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1103)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:541)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$94/681094281.getObject(Unknown Source)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1065)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:584)
    ... 20 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.hibernate.SessionFactory]: Circular reference involving containing bean 'dataBeans' - consider declaring the factory method as static for independence from its containing instance. Factory method 'sessionFactoryProvider' threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:579)
    ... 33 common frames omitted
Caused by: java.lang.NullPointerException: null
    at org.webapp.example.school.data.repository.DataBeans.sessionFactoryProvider(DataBeans.java:30)
    at org.webapp.example.school.data.repository.DataBeans$$EnhancerBySpringCGLIB$$ebde0844.CGLIB$sessionFactoryProvider$0(<generated>)
    at org.webapp.example.school.data.repository.DataBeans$$EnhancerBySpringCGLIB$$ebde0844$$FastClassBySpringCGLIB$$f2417c25.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:361)
    at org.webapp.example.school.data.repository.DataBeans$$EnhancerBySpringCGLIB$$ebde0844.sessionFactoryProvider(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    ... 34 common frames omitted

> Task :bootRun FAILED

我尝试将 EntityManagerFactory 作为创建会话工厂的 bean 方法的参数,但由于循环依赖而失败。

    @Bean
public SessionFactory sessionFactoryProvider(EntityManagerFactory entityManagerFactory) {
    return entityManagerFactory.unwrap(SessionFactory.class);
}

从1.5升级到2.1.3时,我遇到了同样的问题,并通过在Dao类中获取Session / SessionFactory而不是在spring init时自动装配来解决。

下面是一个例子:

  1. 删除示例中的 DataBean
  2. 在 Dao 类中使用以下方法获取 Session:
@Repository
@Transactional
public class XXXDao {
    @Autowired
    private EntityManager entityManager;

    private Session getSession() {
        return entityManager.unwrap(Session.class);
    }
...
}

如果您确实需要 SessionFactory,请使用以下编码,并注意您可能需要手动处理事务。

@Repository
public class XXXDao {

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    private SessionFactory getSessionFactory() {
        return entityManagerFactory.unwrap(SessionFactory.class);
    }
...
}

我建议您还检查Spring Boot Hibernate 没有事务正在进行对于交易问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring Boot 2.0 / Hibernate 5 中获取 SessionFactory 的相关文章

随机推荐

  • 合并字典而不覆盖值

    这似乎是一个简单的任务 我正在尝试合并两个字典而不覆盖值但附加 a 1 1 1 2 2 2 3 3 3 4 4 b 3 5 5 4 6 6 元组数量 a 4 元组数量 b 2 这就是为什么我单独列出这些选项 因为它们会覆盖 all dict
  • 当隔离级别为 READ_UNCOMMITTED 时,无法看到正在运行的事务插入的行

    我有将行插入表的应用程序A同时 每个应用程序以批处理模式插入行 使用 JDBC 准备好的语句 每批使用一个事务 以避免在每次插入后重建索引 INSERT 每个批次中存在的行是完全独立的 事务仅用于优化 每个插入的行都会自动设置其主键 AUT
  • 以图像为背景的热图

    我正在尝试使用 R 制作热图 我正在尝试使用 ggplot2 我的实际数据框要大得多 但在这里我只包含一小部分 x lt c 502 9 512 1 716 6 759 7 776 1 776 5 736 1 271 3 304 7 279
  • 在NDK中使用资源文件

    我正在创建一个 NDK 库 它需要包含和访问二进制数据文件 dat 扩展名 我无法让已编译的库查看此文件 为了让事情变得更加困难 我在库包中执行此操作 我认为如果在我的 Android mk 文件期间 将此 dat 文件复制到我的应用程序的
  • 如何在ASP.NET中获取提示值?

    我想要做的是 当用户在提示框中输入文本并按下 确定 按钮时 提示框会将值发送回string prmt 如果他们取消了提示 则不会执行任何操作 Codes string prmt if ren gt 1 ClientScript Regist
  • 静态方法的目的是什么?我如何知道何时使用? [复制]

    这个问题在这里已经有答案了 我使用以下代码在 python 中遇到了未绑定方法错误 import random class Sample object def drawSample samplesize List sample random
  • 让 Rails 接受欧洲日期格式 (dd/mm/yyyy)

    我希望我的 Rails 应用程序接受格式为 dd mm yyyy 的日期字段的日期 在我的模型中 我尝试将日期转换为美国标准 我认为 Rails 将调用它的 Date parse 方法是期望的 before validation check
  • 为列表视图设置背景

    我有四个选项卡 其中包含四个列表视图 我想为每个列表视图设置背景 但每当我尝试添加背景时 它都会将图像放置在列表视图的每个单元格中 而不是列表后面
  • Swift Json 如何在没有顶级密钥和自动生成的密钥的情况下进行解码

    这对我没有帮助 Swift 4 解析 1 n 数量的 json 数字键 情况有所不同 我有这个 JSON 稍微简化了一点 1 name Tea room description A room for tea 2 name Playgroun
  • 如何在root手机上获取NFCEE_ADMIN权限?

    NFCEE ADMIN 权限是签名级别 但是 是否有可能在已root的手机上 作弊 以获得此权限 也许使用类似的技术ClockSync 的工作方式 我正在尝试使用反射技术来访问 NFCExtras mAdapter NfcAdapter g
  • 如何在Python 3中生成0到无穷大之间的N个随机数

    如何在 python 3 中生成 n 个随机数 n为待 定变量 最好是自然数 整数 gt 0 我找到的所有答案都采用一定范围内的随机整数 但是我不想从一定范围内生成数字 除非范围是 0 到无穷大 用维特根斯坦的话来说 机器的限制就是语言的限
  • Woocommerce (3.0) 产品类型不会保存

    最近将 Woocommerce 更新到 3 0 之后我在保存我创建的自定义产品类型时遇到问题 这就是代码现在的样子 function register xxxxxx product type class WC Product package
  • 如何在任务栏上制作Windows 7加载栏

    I want to create a windows 7 loading bar on the taskbar something like this 我已经有一个 jframe 框架 可以在其中加载游戏 我想让loadingbar显示下载
  • Vectorise 查找最接近的日期函数

    我想传递一个日期向量 并从第二个 部分匹配 日期向量返回最接近的日期 以下函数满足我对单个日期的要求 但是我不知道如何将其推广到以下情况 searchDate是日期向量 closestDate lt function searchDate
  • Linq:如何将行转换为具有计数的列(交叉表数据)?

    我认为我需要一种方法来使用 C 和 Linq 执行具有不确定数量的列的数据透视表或交叉表 不过 我将添加一些开始细节 看看它会走向何方 想象一个有两个字段的表 string EventName Datetime WhenItHappend
  • 更改背景颜色不透明度而不更改背景图像不透明度

    我想在用户悬停按钮时增加按钮的背景颜色亮度 但我想这样做 无论按钮的颜色如何 在下面 您可以看到四个按钮 只有最后一个有效 因为它有 hover处理程序显式配置为黄色 hoverme display inline block padding
  • 使用 LinkedIn API CDN(https://platform.linkedin.com/in.js) 登录是否已损坏?

    我正在使用 Angular v6 的不同 NPM 包通过 LinkedIn API 登录 但我在每个包裹中都面临一个问题 即使在上次运行的用 JavaScript 开发的网站中 现在也抛出了同样的问题 调试后发现问题在https platf
  • jquery - 连续使用 .done() 给出与 .then() / .done() 相同的结果

    编辑 请参阅底部的注释 了解为什么我不认为这是重复的问题 使用jquery 3 2 1和Bootstrap 3 3 7 我的应用程序的部分流程如下 用户单击模式窗口内 ID 为的锚点 notifierModal 这使得第一个ajax请求它将
  • Ruby 数组中的差异(包括重复项)

    1 2 3 3 1 2 3 产生空数组 是否可以保留重复项以便返回 3 我很高兴你问了 我希望看到这样的方法添加到类中Array在 Ruby 的未来版本中 我发现它有很多用途 class Array def difference other
  • 在 Spring Boot 2.0 / Hibernate 5 中获取 SessionFactory

    我正在使用HibernateJpaSessionFactoryBean在 Spring Boot 1 5 x 中为我的会话获取会话工厂 bean 由于现在已弃用 我尝试通过在 EntityManagerFactory 中展开来使用会话工厂