2016-02-02 83 views
0

我想在更新桌面應用程序後在嵌入式derby數據庫上運行更改。要做到這一點,我試圖創建一個JPS庫與我類似這樣ALTER查詢:數據庫更改和彈簧啓動JPA

@Repository 
public interface DatabaseUpdates { 
    @Modifying 
    @Query("alter table my_table add column my_column clob", nativeQuery = true) 
    void alterMyTableAddMyColumn(); 
} 

並使用它在更新類這樣

@Component 
public class DatabaseUpdater { 
    @Autowired 
    private DatabaseUpdates databaseUpdates; 

    private void alterMyTable() { 
     // some logic that checks it the update needs to happen is here 
     databaseUpdates.alterMyTableAddMyColumn(); 
    } 
} 

這引發NoSuchBeanDefinitionException: No qualifying bean of type DatabaseUpdates例外。

我也試過讓DatabaseUpdates擴展org.springframework.data.repository.Repository,但後來遇到了使用什麼類型的問題。我正在使用spring-boot-starter-data-jpa 1.2.3.RELEASE。

編輯:這是爲了支持遺留應用程序,我正在尋找直接支持數據庫更新的方法。數據庫遷移工具很好,但不在此修補程序的範圍內。我一直希望這個項目已經使用了一個多月的時間,並且很快就會將其整合到下一個版本中。

+0

所以你認爲這個「alter table my_table add column my_column clob」是JPQL嗎?那不是。這是SQL。 –

+0

@NeilStockton我忘記了'nativeQuery = true'國旗抱歉。我試圖用遺留代碼解決一些問題,並且不熟悉JPA或Spring。 – nash

+0

@nash真的需要在運行時發生嗎?你不能直接讓他們直接到數據庫?如果是這樣,你是否可以創建一個簡單的鍵/值表,讓你獲得各種數據元素並將它們關聯回記錄?例如而不是將第Y列的值Y添加到表Q中,您可以創建一個FK到Q記錄的表以及Key和Value列。因此,你可以是完全可擴展的(儘管你失去了類型安全性,但是如果你使用clobs,你會失去它) – Ben

回答

1

這聽起來像一個可怕的想法。有一些框架專門爲您的用例開發,並且受Spring Boot支持,如FlywayLiquibase。然後,您可以在SQL或Java代碼(用於Flyway)或XML,SQL,YAML或JSON文件(用於Liquibase)中指定您的更改。這些框架將檢查哪些遷移是必要的,並且他們還會跟蹤執行遷移的時間。

+0

這不是我的問題的答案。該應用程序在這一點上是有效的,我正在尋找直接解決方案來升級數據庫。我已經有計劃在下一個版本中集成數據庫遷移工具。 – nash

1

我不會把它放在Spring JPA中。如果您提到它是臨時的,也許可以直接嘗試一些JDBC並在數據庫上運行查詢。嘗試記錄您在表中做出的更改(類似於liquibase正在進行的操作),因此您不會多次運行查詢。 也許試着在Spring在你的DatabaseConfiguration類中構建DataSource之前運行它。

@Configuration 
    @EnableJpaRepositories("") 
    @EnableTransactionManagement 
    public class DatabaseConfiguration implements EnvironmentAware { 

      @Bean(destroyMethod = "close") 
      public DataSource dataSource(DataSourceProperties dataSourceProperties, ApplicationProperties applicationProperties) 
        throws SQLException { 
       LOG.debug("Configuring Datasource"); 
       //some code 
       alterSchema(); 
       return new HikariDataSource(config); 
      } 

      private void alterSchema() { 
       // JDBC connection and queries to alter the schema 
      } 

    } 
0

儘管不是最佳實踐,但您可以暫時使用本機JDBC,從現有數據源獲取連接。如果您只添加一列,請確保檢查對象(列)是否已經存在。