【问题标题】:Spring and Hibernate 5. SessionFactory always nullSpring 和 Hibernate 5. SessionFactory 始终为空
【发布时间】:2018-06-07 16:33:54
【问题描述】:

我花了几个小时试图完成这项工作,但我总是得到相同的结果,SessionFactory 总是为空。我正在使用 Spring Boot 和 Hibernate 5。

我从这里和其他网页尝试了很多可能的解决方案,但我无法解决。 @Autowire 注释似乎不起作用。这是完整的代码。它是如此空虚,因为我正处于项目的开始阶段。

编辑:我已经像其他用户所说的那样编辑了所有内容以进行调整,但我遇到了另一个错误。

现在错误是这样说的:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sessionConfig': Unsatisfied dependency expressed through field 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getSessionFactory' defined in class path resource [com/cibervoluntarios/app/util/SessionConfig.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 'sessionConfig' - consider declaring the factory method as static for independence from its containing instance. Factory method 'getSessionFactory' threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:586) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:91) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:372) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1344) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:758) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868) ~[spring-context-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:138) ~[spring-boot-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:751) [spring-boot-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:387) [spring-boot-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) [spring-boot-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1245) [spring-boot-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1233) [spring-boot-2.0.0.BUILD-SNAPSHOT.jar:2.0.0.BUILD-SNAPSHOT]
    at com.cibervoluntarios.app.CibervoluntariosPruebas2Application.main(CibervoluntariosPruebas2Application.java:12) [classes/:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'getSessionFactory' defined in class path resource [com/cibervoluntarios/app/util/SessionConfig.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 'sessionConfig' - consider declaring the factory method as static for independence from its containing instance. Factory method 'getSessionFactory' threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:587) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1250) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1099) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:502) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:312) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:251) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1135) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1062) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:583) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    ... 19 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.hibernate.SessionFactory]: Circular reference involving containing bean 'sessionConfig' - consider declaring the factory method as static for independence from its containing instance. Factory method 'getSessionFactory' threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:579) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    ... 31 common frames omitted
Caused by: java.lang.NullPointerException: null
    at com.cibervoluntarios.app.util.SessionConfig.getSessionFactory(SessionConfig.java:16) ~[classes/:na]
    at com.cibervoluntarios.app.util.SessionConfig$$EnhancerBySpringCGLIB$$870befb7.CGLIB$getSessionFactory$0(<generated>) ~[classes/:na]
    at com.cibervoluntarios.app.util.SessionConfig$$EnhancerBySpringCGLIB$$870befb7$$FastClassBySpringCGLIB$$4a4fa31.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:361) ~[spring-context-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    at com.cibervoluntarios.app.util.SessionConfig$$EnhancerBySpringCGLIB$$870befb7.getSessionFactory(<generated>) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_152]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_152]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_152]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_152]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.0.2.RELEASE.jar:5.0.2.RELEASE]
    ... 32 common frames omitted

主要

@SpringBootApplication
public class CibervoluntariosAppApplication {

    private userDAO prueba;

        @RequestMapping("/")
        @ResponseBody
        String home() {
            return "Hello World. How are you?";
        }

        @RequestMapping("/user")
        @ResponseBody
        String isertuser() {
            prueba = new userDAO();
            users user = new users();
            user.setPassword("qwerty");
            BigInteger cosa = new BigInteger("12345678");
            user.setSocial_id(cosa);
            user.setSocial_network("Facebook");
            user.setUsername("Pepe");
            prueba.insertUser(user);
            return "Test";
        }

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

users.java

@Entity
@Table(name = "users")
public class users {

    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private BigInteger id;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "social_id")
    private BigInteger social_id;

    @Column(name = "social_network")
    private String social_network;

    public BigInteger getId() {
        return id;
    }

    public void setId(BigInteger id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public BigInteger getSocial_id() {
        return social_id;
    }

    public void setSocial_id(BigInteger social_id) {
        this.social_id = social_id;
    }

    public String getSocial_network() {
        return social_network;
    }

    public void setSocial_network(String social_network) {
        this.social_network = social_network;
    }

}

usersDAO --> 这里是 SessionFactory 有一个空值的地方

    @Repository
public class userDAO {

    private SessionFactory sessionFactory;

    public void insertUser(users user) {
        Session session = null;
        try {           
            session = sessionFactory.getCurrentSession();
            session.beginTransaction();
            session.save(user);
            session.getTransaction().commit();
        }catch (Exception e) {
            session.getTransaction().rollback();
        }
    }

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }


}

LoginService.java

@Service
public class LoginService {

    @Autowired
    private userDAO userManagement;

    public void insertUser(users userToAdd) {
        this.userManagement.insertUser(userToAdd);
    }
}

登录控制器

@RestController
@RequestMapping("/")
public class SignInController {

    @Autowired
    private LoginService loginService;

    @RequestMapping("/hello")
    @ResponseBody
    public String home() {
        return "Hello World. How are you?";
    }

    @RequestMapping("/add")
    public void insertUser() {
        users user = new users();
        user.setPassword("qwerty");
        BigInteger cosa = new BigInteger("12345678");
        user.setSocial_id(cosa);
        user.setSocial_network("Facebook");
        user.setUsername("Pepe");
        this.loginService.insertUser(user);
    }
}

这是具有必要配置代码的类

@Configuration
public class SessionConfig {

    @Bean
    public SessionFactory sessionFactory(@Autowired EntityManagerFactory factory) {
            if (factory.unwrap(SessionFactory.class) == null) {
                throw new NullPointerException("factory is not a hibernate factory");
            }
            return factory.unwrap(SessionFactory.class);
    }
}

【问题讨论】:

  • 当然是null...在SessionFactory 的字段或setter 方法上都没有@Autowired。所以 Spring 不知道它应该注入它。另外你为什么要使用SessionFactory?只需注入 EntityManager 并使用 JPA。通常使用当前版本的 JPA,您不再需要本机 Hibernate...

标签: java hibernate spring-boot sessionfactory


【解决方案1】:

你想太多了,把事情弄复杂了。而不是普通的 Hibernate API,只需使用 JPA。你不需要SessionConfig 抛弃它。

您的CibervoluntariosAppApplication 应该只有main 方法,其中带注释的方法实际上没有意义。

@SpringBootApplication
public class CibervoluntariosAppApplication {

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

现在你的UserDao 应该使用EntityManager(Spring Boot 已经提供)而不是SessionFactory

@Repository
public class userDAO {

    @PersistenceContext
    private EntityManager em;

    public void insertUser(users user) {
        em.persist(user);
    }
}

不要手动进行事务管理,而是将 @Transactional 添加到您的 @Service 注释类中。

@Service
@Transactional
public class LoginService {

    @Autowired
    private userDAO userManagement;

    public void insertUser(users userToAdd) {
        this.userManagement.insertUser(userToAdd);
    }
}

所有这些都减少了您必须编写的代码,并且由于从您的配置中删除了不必要的 bean,从而降低了复杂性。

【讨论】:

  • 非常感谢您的帮助!问题解决了,从现在开始我将使用 JPA。这是我使用 Spring 的第三天,编写代码的理念与我习惯的完全不同。现在,我开始了解它的一些特殊性:)
【解决方案2】:

如果你不使用DI 来注入你的 DAO (userDAO)。 userDao 类中的所有注释都不起作用。

请像这样更新您的代码:

@SpringBootApplication
@Controller
public class CibervoluntariosAppApplication {

    @Autowired
    private userDAO prueba;

        @RequestMapping("/")
        @ResponseBody
        String home() {
            return "Hello World. How are you?";
        }

        @RequestMapping("/user")
        @ResponseBody
        String isertuser() {
            users user = new users();
            user.setPassword("qwerty");
            BigInteger cosa = new BigInteger("12345678");
            user.setSocial_id(cosa);
            user.setSocial_network("Facebook");
            user.setUsername("Pepe");
            prueba.insertUser(user);
            return "Test";
        }

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

记住始终使用java naming conventions

【讨论】:

  • 是的,我已经修改了它,但它不起作用,SessionFactory 始终为空。依赖错误,但如果我用另一个注释手动添加它,它会给我一个循环错误。为什么要把事情复杂化?为什么这个简单的操作变得如此困难?这是一个简单的 SessionFactory!
  • 能否发布项目结构和错误日志?
  • 你是如何声明 EntityManagerFactory 的?
  • 我不知道到底是怎么回事。我一直在关注几个教程,但我总是得到一个空结果。网页是这个devglan.com/spring-boot/spring-boot-hibernate-5-example 我编辑了主要信息。错误现在不同了
  • 该示例存在缺陷,指定的配置不需要使用 Hibernate 作为 JPA 提供程序。如果您想使用普通的 Hibernate 而不是 JPA,则需要它。
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多