我在 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條經驗 獲得超13個贊
我在本地運行了你的項目。當我運行兩次時,你是對的,我得到了表已經存在的錯誤。解決方案是
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。

眼眸繁星
TA貢獻1873條經驗 獲得超9個贊
刪除以下 yaml 配置后:
# temp: # use_jdbc_metadata_defaults: "false"
該問題不再出現。當然,現在我們收到了奇怪的 CLOB 相關錯誤,但它們似乎沒有產生真正的影響,所以這是一個單獨的問題。

慕少森
TA貢獻2019條經驗 獲得超9個贊
我讀了你的問題。問題不依賴于數據庫,我認為你的問題是你沒有為你的項目使用數據庫版本控制。版本控制為您處理所有這些事情(它知道何時創建或更改等等)。
這些是很好的數據庫版本控制,您可以使用?liquibase?Flyway
我的意見是使用 liquibase 因為它更容易與非常好的文檔
添加回答
舉報
0/150
提交
取消