使用@Repository注释Dao类时,Spring Boot 2.1和Hibernate 5.3 SessionFactory无法自动装配

时间:2019-01-30 07:21:01

标签: java spring spring-boot

当我在以@Repository spring注释为注释的Dao实现中自动连接休眠会话工厂时,它无法创建SessionFactory和Dao bean,但是在没有@Repository注释的情况下可以正常工作。

我搜索了很多问题和答案,但是所有问题和早期版本的hibernate和spring boot都一样,如unwrap,并创建了会话工厂bean,但所有这些方法都不与spring-boot 2.1和最新的Hibernate版本兼容。

在Spring Boot 2.1和最新的Hibernate版本(5.3)中,是否有任何特定的方法来创建和自动连接休眠会话工厂?

@Repository
public class UserDaoImpl implements UserDao {

    @Autowired
    private SessionFactory sf;

    @Override
    public void addUser(User user) {
        Session session = sf.getCurrentSession();
        session.save(user);
    }


}

在上面的代码中,SessionFactory在没有@Repository的情况下自动连接,我用下面的bean创建了一个配置类

@Configuration
public class DataConfig {
    @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);
    }

}

课程“应用程序上下文中某些bean的依赖关系形成一个循环:”错误

2 个答案:

答案 0 :(得分:0)

@Bean
public SessionFactory sessionFactory() {
    LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource());
    sessionBuilder.scanPackages("com.your.domain.package");
    return sessionBuilder.buildSessionFactory();
}

@Bean
public DataSource dataSource() {
    final HikariConfig config = new HikariConfig();
    config.setMinimumIdle(Integer.valueOf(env.getProperty("spring.datasource.minimumIdle")));
    config.setMaximumPoolSize(Integer.valueOf(env.getProperty("spring.datasource.maximumPoolSize")));
    config.setIdleTimeout(Integer.valueOf(env.getProperty("spring.datasource.idleTimeout")));
    config.setConnectionTestQuery("SELECT 1");
    config.setDataSourceClassName(env.getProperty("spring.datasource.className"));
    config.addDataSourceProperty("url", env.getProperty("spring.datasource.url"));
    config.addDataSourceProperty("user", env.getProperty("spring.datasource.username"));
    config.addDataSourceProperty("password", env.getProperty("spring.datasource.password"));
    return new HikariDataSource(config);
}

@先生。不错,以这种方式更改您的配置以解决此问题。

答案 1 :(得分:-1)

@Repository
public class CustomerDAOImpl implements CustomerDAO {
    @Autowired
    private EntityManager entityManager;
//for save Entity And also you can create generic method        
    @Override
    public void saveCustomer(User user) {
       entityManager.persist(user); 
    } 
}
//get all list using this generic method
public <T> List<T>  gentAllList(Class<T> t){    
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<T> cq = cb.createQuery(t);
        Root<T> rt = cq.from(t);
        cq.select(rt);
        TypedQuery<T> q = entityManager.createQuery(cq);
        List<T> cust = q.getResultList();
        return cust;
    }