【问题标题】:Hibernate Spring: spring.jpa.hibernate.ddl-auto property doesn't create generate tables doesn't workHibernate Spring:spring.jpa.hibernate.ddl-auto 属性不创建生成表不起作用
【发布时间】:2020-06-26 22:54:42
【问题描述】:

我正在使用带有 Hibernate 的 Spring MVC。我使用配置 Java 类配置 Hibernate:

DbConfig.java

@Configuration
 @EnableTransactionManagement
@EnableJpaRepositories(basePackages = "testproject", entityManagerFactoryRef = "entityManagerFactory")
 public class DbConfig {
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(getDatasource());
        entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);

        entityManagerFactoryBean.setJpaProperties(getHibernateProperties());

        entityManagerFactoryBean.setPackagesToScan("testproject");

        return entityManagerFactoryBean;
    }


    @Bean
    public DataSource getDatasource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.postgresql.Driver");
        dataSource.setUrl("jdbc:postgresql://127.0.0.1:5432/testproject");
        dataSource.setUsername("postgres");
        dataSource.setPassword("mypass");
        return dataSource;
    }

    @Bean
    public SessionFactory getSessionFactory() throws IOException {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setPackagesToScan("testproject");
        //getHibernateProperties method is a private method

        sessionFactoryBean.setHibernateProperties(getHibernateProperties());
        sessionFactoryBean.setDataSource(getDatasource());
        sessionFactoryBean.afterPropertiesSet();

        return sessionFactoryBean.getObject();
    }

    @Bean(name = "transactionManager")
    public HibernateTransactionManager getTransactionManager() throws IOException {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(getSessionFactory());
        return transactionManager;
    }


    private static Properties getHibernateProperties() {
        Properties hibernateProperties = new Properties();
        hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
        hibernateProperties.put("hibernate.show_sql", false);
        hibernateProperties.put("spring.jpa.hibernate.ddl-auto", "create");

        System.out.println();
        // other properties
        return hibernateProperties;
    }
}

自动创建表是在getHibernateProperties方法里面配置的:

hibernateProperties.put("spring.jpa.hibernate.ddl-auto", "create");

但它似乎不起作用:在我部署服务器并尝试插入实体后,我收到错误并且数据库没有表。

【问题讨论】:

  • 错误是什么?
  • @MinarMahmund org.hibernate.exception.SQLGrammarException: could not extract ResultSet - 这不是重点 - 发生错误是因为尚未创建表。问题是关于如何让 Hibernate 自动创建表
  • 您的org.hibernate.SQL logger 记录了什么?

标签: java spring hibernate spring-mvc jpa


【解决方案1】:

属性spring.jpa.hibernate.ddl-auto 的类型为org.springframework.boot.autoconfigure.orm.jpa.JpaProperties.Hibernate,它来自Spring Boot。但是您使用的是 Spring MVC

请改用hibernate.hbm2ddl.auto


进一步阅读

这是有效的属性代码:

   @Bean
    private static Properties getHibernateProperties() {
        Properties hibernateProperties = new Properties();
        hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
        hibernateProperties.put("hibernate.show_sql", true);
        hibernateProperties.put( "hibernate.hbm2ddl.auto", "create-drop");
        return hibernateProperties;
    }

【讨论】:

    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2020-04-11
    • 2021-10-03
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多