Spring hibernate 不创建 mysql 表

Spring hibernate does not create mysql tables

我正在实现一个具有两个数据库连接的后端。一个到 MS Access 数据库,另一个到 MySQL 数据库。我已经设置了两个配置 类 并且 应用程序 运行ning 没有任何错误 消息,但是 没有创建 tables 代表我在 mysql db.

中的实体

项目结构:

my.backend
  |
  --> configuration
  --> controller
  --> exceptions
  --> model
  | |
  | --> mysql
  | --> msaccess
  |
  --> repo
  | |
  | --> mysql
  | --> msaccess
  |
  --> service

我的配置文件如下所示: MySQL配置:

imports [...]

@Configuration
@EnableJpaRepositories(
        entityManagerFactoryRef = "mysqlEntityManagerFactory",
        transactionManagerRef = "mysqlTransactionManager",
        basePackages = "my.backend.repo.mysql"
)
public class MySqlJpaConfig {
    @Autowired
    private Environment env;

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "mysql")
    public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(mysqlDataSource());
        em.setPackagesToScan("my.backend.model.mysql");
        em.setPersistenceUnitName("mysql");
        em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        HashMap<String, Object> jpaProperties = new HashMap<>();
        jpaProperties.put("hibernate.ddl-auto",
                env.getProperty("mysql.jpa.hibernate.ddl-auto"));
        jpaProperties.put("hibernate.dialect",
                env.getProperty("mysql.jpa.properties.hibernate.dialect"));
        em.setJpaPropertyMap(jpaProperties);

        return em;
    }

    @Primary
    @Bean
    public DataSource mysqlDataSource() {

        DriverManagerDataSource dataSource
                = new DriverManagerDataSource();
        dataSource.setUrl(env.getProperty("mysql.url"));
        dataSource.setUsername(env.getProperty("mysql.username"));
        dataSource.setPassword(env.getProperty("mysql.password"));
        dataSource.setDriverClassName(Objects.requireNonNull(env.getProperty("mysql.driver-class-name")));

        return dataSource;
    }

    @Primary
    @Bean
    public PlatformTransactionManager mysqlTransactionManager() {

        JpaTransactionManager transactionManager
                = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
                mysqlEntityManagerFactory().getObject());
        return transactionManager;
    }
}

MS 访问配置:

@Configuration
@EnableJpaRepositories(
        entityManagerFactoryRef = "msaccessEntityManagerFactory",
        transactionManagerRef = "msaccessTransactionManager",
        basePackages = "my.backend.repo.msaccess"
)
@EnableTransactionManagement
public class MsAccessJpaConfig {
    @Autowired
    private Environment env;

    @Bean
    @ConfigurationProperties(prefix = "mysql")
    public LocalContainerEntityManagerFactoryBean msaccessEntityManagerFactory() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(msaccessDataSource());
        em.setPackagesToScan("my.backend.model.msaccess");
        em.setPersistenceUnitName("msaccess");
        //em.setPersistenceProvider(new HibernatePersistenceProvider());
        em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        HashMap<String, Object> jpaProperties = new HashMap<>();
        jpaProperties.put("hibernate.dialect",
                env.getProperty("msaccess.jpa.properties.hibernate.dialect"));
        em.setJpaPropertyMap(jpaProperties);
        return em;
    }

    @Bean
    public DataSource msaccessDataSource() {

        DriverManagerDataSource dataSource
                = new DriverManagerDataSource();
        dataSource.setUrl(env.getProperty("msaccess.url"));
        dataSource.setDriverClassName(Objects.requireNonNull(env.getProperty("msaccess.driver-class-name")));

        return dataSource;
    }

    @Bean
    public PlatformTransactionManager msaccessTransactionManager() {

        JpaTransactionManager transactionManager
                = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
                msaccessEntityManagerFactory().getObject());
        return transactionManager;
    }

}

还有我的 application.properties 文件:

spring.jpa.show-sql=true
spring.jpa.open-in-view=false
# MySQL config
mysql.url=jdbc:mysql://localhost:3306/my_database
mysql.username=
mysql.password=
mysql.driver-class-name=com.mysql.cj.jdbc.Driver
mysql.jpa.hibernate.ddl-auto=update
mysql.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
# MS Access config
msaccess.url=jdbc:ucanaccess://c:/users/username/documents/test.accdb
msaccess.driver-class-name=net.ucanaccess.jdbc.UcanaccessDriver
msaccess.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServerDialect

当我 运行 我的应用程序没有自定义配置并且只有一个原始数据库连接(只有 MySQL)时一切正常。此外,如果我 运行 执行此操作并执行获取请求,我会收到一个错误,指出 table 不存在(显然),因此存在与 MySQL 的连接,但应用程序不会创建我需要的 tables。顺便说一句,MS Access 的工作方式相同,但我不希望那里有 table 代。

我是否遗漏了一些连接配置?

感谢您的帮助! 干杯,尼克拉斯

我的猜测是您必须在 jpa 属性配置中使用 hibernate.hbm2ddl.auto 而不是 hibernate.ddl-auto,因为这是 hibernate 查找的名称