当我在以@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的依赖关系形成一个循环:”错误
答案 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;
}