【问题标题】:problems configuring Hibernate with spring boot, CommandLineRunner使用 Spring Boot 配置 Hibernate 时出现问题,CommandLineRunner
【发布时间】:2015-11-13 16:33:19
【问题描述】:

我正在使用 Spring Tool Suite 创建一个使用 Hibernate 的 Spring Boot 应用程序。

这是我的 application.properties 文件:

spring.datasource.url=jdbc:mysql:someurl
spring.datasource.username=somename
spring.datasource.password=somepassword
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=create
spring.jpa.database-platform=org.hibernate.dialect.SQLServerDialect
spring.jpa.show-sql=true

我正在尝试运行以下 CommandLineRunner:

@Bean
public CommandLineRunner demo(CustomerRepository repository) {
    return (args) -> {

        Configuration configuration = new Configuration().configure();

        ServiceRegistryBuilder registry = new ServiceRegistryBuilder();
        registry.applySettings(configuration.getProperties());
        ServiceRegistry serviceRegistry = registry.buildServiceRegistry();
        SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

        Session session = sessionFactory.openSession();

        Transaction t = session.beginTransaction();

        Customer e1 = new Customer();
        //blah blah blah
        session.persist(e1);

        t.commit();

        session.close();


    };
}

我的问题是:

Configuration configuration = new Configuration().configure();

查找“hibernate.cfg.xml”,我所有的休眠配置都在 application.properties 中

如何使 Hibernate 配置内容使用 application.properties 中的内容进行自我初始化?

【问题讨论】:

    标签: spring hibernate


    【解决方案1】:

    如果您使用的是 spring boot,配置会自动加载应用程序属性。仅当需要额外配置或以编程方式修改现有配置时才需要它。

    我猜,你不需要它们中的任何一个来完成这项工作,也就是说,你总是可以使用它而不是设置配置来获取 sessionfactory:

    @Autowired
    private EntityManagerFactory entityManagerFactory;
    
    @Bean
    public SessionFactory getSessionFactory() {
        if (entityManagerFactory.unwrap(SessionFactory.class) == null) {
            throw new NullPointerException("Not a hibernate factory exception");
        }
        return entityManagerFactory.unwrap(SessionFactory.class);
    }
    

    这样,您的配置会自动加载并获​​得 sessionfactory。

    希望这会有所帮助。

    【讨论】:

    • 那么,如果我的 hibernate/jpa 配置在 applications.properties 中,你是说我可以通过自动装配的 EntityManagerFactory 访问它们吗?
    • 是的,或者只是实体管理器,例如:@PersistenceContext(unitName = "default") private EntityManager entityManager; entityManager.find(args..)
    • 另外,请记住,如果您使用的是 spring boot 和 hibernate JPA,那么您的实体(又名客户)应该在同一个 maven 模块中,基本上在 entityscan(@EntityScan(basePackages = ... .)) 和 Customer 应该用 @Entity.. 注释。
    • 那么究竟如何使用 entityManagerFactory 来创建会话呢?
    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 2017-06-14
    • 2017-02-02
    • 1970-01-01
    • 2020-03-16
    • 2014-06-21
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多