gpt4 book ai didi

java - 基于 Hibernate SessionFactory 注解的配置

转载 作者:行者123 更新时间:2023-11-29 04:34:13 25 4
gpt4 key购买 nike

我最近的目标是构建一个 spring boot 应用程序,但没有任何 XML 配置文件(或尽可能少),所以我想避免使用一些 XML 文件(即 web.xml),尤其是对于某些 bean 定义部分。

接下来是更难的部分。

我想使用 @Autowired 注释将一个 SessionFactory bean 注入(inject)到类中,但每次我尝试启动应用程序时,我都会得到:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'temperatureController': Unsatisfied dependency expressed through field 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: EntityManagerFactory must not be null

好的,我知道 Spring 没有 SessionFactory bean,因为它没有 EntityManagerFactory。

因此,如果有任何解决此问题的建议,我将不胜感激,但只能通过注释进行配置。

到目前为止,我阅读了与我类似的关于以这种方式在 @Configuration 类中指定一个 bean 的帖子:

@Bean
public HibernateJpaSessionFactoryBean sessionFactory() {
return new HibernateJpaSessionFactoryBean();
}

然后将这一行添加到属性文件中:

spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

最后,带有 SessionFactory 的 @Autowired 应该可以正常工作。但是,当然对我来说它不起作用。

有什么想法我应该做些什么不同/更好吗?

我的属性文件非常基础:

spring.jpa.show-sql = true spring.datasource.password=mysql spring.datasource.username=mysql spring.datasource.testWhileIdle = true spring.jpa.hibernate.ddl-auto = update spring.datasource.validationQuery = SELECT 1 spring.datasource.url= jdbc:mysql://localhost:3306/sys spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

最佳答案

通常当我想定义一些简单的东西时,我会创建一个类似于以下的类:

@Configuration
@EnableTransactionManagement
public class PersistanceJpaConfig {

@Bean
public LocalSessionFactoryBean hibernateSessionFactory(DataSource dataSource) {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setPackagesToScan(new String[] {
"my.entities.package"
});
sessionFactory.setHibernateProperties(additionalProperties());

return sessionFactory;
}

@Bean HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(sessionFactory);

return transactionManager;
}

@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306");
dataSource.setUsername("user");
dataSource.setPassword("password");
return dataSource;
}

Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "update");
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL57InnoDBDialect");
return properties;
}

}

通过使用@EnableTransactionManagement并创建一个LocalSessionFactoryBean类型的bean,spring会自动为你创建一个SessionFactory bean,你可以注入(inject)/在任何地方 Autowiring 。

当然,如果需要,您可以从属性文件中注入(inject)一些配置。

关于java - 基于 Hibernate SessionFactory 注解的配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42400446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com