2012-08-07 48 views
2

我有一個實體類,我希望休眠時用一些常量值填充DB中的對應表:包含一些數據的幾行(如果沒有值或替換...) 我怎樣才能讓hibernate做到這一點(理想情況下使用註釋)?hibernate填充表如果爲空

我使用hibernate 3.2和spring 3.1。

在此先感謝!

回答

0

什麼時候要填充表格?

我們檢查應用程序啓動時的數據庫狀態,並使用Spring的ContextLoaderListener填充一些表,如果它們是空的 - 這樣的事情:

public class ExampleContextLoaderListener extends ContextLoaderListener { 
    private static Log LOG = LogFactory.getLog("ContextLoaderListener"); 

    public void contextInitialized(final ServletContextEvent event) { 

     super.contextInitialized(event); 

     final DBService dbService = 
      getCurrentWebApplicationContext().getBean(DBService.class); 
     if (!db.initalized()) { 
      LOG.info("DB empty ... adding new data"); 
      // etc. 
     } else { 
      LOG.info("DB already initalized.") 
     } 

    } 
} 

另見how to test if a table is empty

1

默認情況下,如果此類文件存在於類路徑的根目錄中,Hibernate會嘗試加載文件「import.sql」(或屬性hibernate.hbm2ddl.import_files指定的文件)的內容。所以,一個「解決方案」是創建一個只保存一個值的表,並且具有唯一的約束。當Hibernate嘗試加載文件時,由於唯一的約束,它將不能再次加載它。我沒有測試過這個,但我認爲它應該起作用。現在

,如果這聽起來對你不好(它確實對我來說),那麼我建議考慮看看是Hibernate使用導入此文件中的代碼:

https://github.com/hibernate/hibernate-orm/blob/4.1.5.Final/hibernate-core/src/main/java/org/hibernate/tool/hbm2ddl/SchemaExport.java#L432

我會將它作爲@Singleton @Startup EJB或上下文監聽器或類似的東西來實現。這個想法是每次應用程序啓動時運行它。然後代碼將檢查數據庫是否爲空,並在需要時導入SQL文件。