为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot - 多个数据源 - hbm2ddl 问题

Spring Boot - 多个数据源 - hbm2ddl 问题

侃侃无极 2023-07-28 15:24:42
我在 Spring Boot(版本 2.1.3.Final)应用程序中定义了多个数据源,对于其中之一,我将 hbm2ddl 设置为更新。但是,如果我第二次运行该应用程序,它总是尝试执行 CREATE TABLE 语句(而不是更改,或者在实体没有更改的情况下不执行任何语句)数据源定义如下所示:    // @formatter:off@EnableJpaRepositories(entityManagerFactoryRef = "triggerEMF", transactionManagerRef = "triggerTM", basePackages = {        "com.customer.trigger.repository" }, excludeFilters = @Filter(CDHRepository.class))// @formatter:on@Configuration@EnableTransactionManagementpublic class TriggerDSConfig {    private static final Logger LOGGER = LoggerFactory.getLogger(TriggerDSConfig.class);    @Autowired    private Environment env;    @Primary    @Bean(name = "triggerDS")    @ConfigurationProperties("trigger.datasource")    public DataSource dataSource() {        return DataSourceBuilder.create().build();    }    @Primary    @Bean(name = "triggerTM")    public PlatformTransactionManager psqlTransactionManager(@Qualifier("triggerEMF") EntityManagerFactory customerEntityManagerFactory) {        return new JpaTransactionManager(customerEntityManagerFactory);    }}该数据源的 YAML 定义如下所示:    trigger:  datasource:    jdbcUrl: jdbc:h2:~/triggerdb2;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL    username: sa    password: sa  hbm2ddl: update  dialect: org.hibernate.dialect.H2Dialect我可以确认DDL脚本没有被执行。hbm2ddl 失败了。我对它进行了相当深入的调试,并且已经达到了这个类: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/tool /schema/internal/GroupedSchemaMigratorImpl.java这是有问题的代码: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/GroupedSchemaMigratorImpl.java #L69-L71
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

我在本地运行了你的项目。当我运行两次时,你是对的,我得到了表已经存在的错误。解决方案是


Map<String, String> props = new HashMap<String, String>();

props.put("hibernate.hbm2ddl.auto", "update");

props.put("hibernate.dialect", env.getProperty("trigger.dialect"));

props.put("hibernate.default_schema", env.getProperty("trigger.schema"));

您的 yml 中可能缺少一些属性。还可以对这些属性使用@Value。


查看完整回答
反对 回复 2023-07-28
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

删除以下 yaml 配置后:

       # temp:
        #  use_jdbc_metadata_defaults: "false"

该问题不再出现。当然,现在我们收到了奇怪的 CLOB 相关错误,但它们似乎没有产生真正的影响,所以这是一个单独的问题。


查看完整回答
反对 回复 2023-07-28
?
慕少森

TA贡献2019条经验 获得超9个赞

我读了你的问题。问题不依赖于数据库,我认为你的问题是你没有为你的项目使用数据库版本控制。版本控制为您处理所有这些事情(它知道何时创建或更改等等)。

这些是很好的数据库版本控制,您可以使用 liquibase Flyway

我的意见是使用 liquibase 因为它更容易与非常好的文档


查看完整回答
反对 回复 2023-07-28
  • 3 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信