我有一個實體類,我希望休眠時用一些常量值填充DB中的對應表:包含一些數據的幾行(如果沒有值或替換...) 我怎樣才能讓hibernate做到這一點(理想情況下使用註釋)?hibernate填充表如果爲空
我使用hibernate 3.2和spring 3.1。
在此先感謝!
我有一個實體類,我希望休眠時用一些常量值填充DB中的對應表:包含一些數據的幾行(如果沒有值或替換...) 我怎樣才能讓hibernate做到這一點(理想情況下使用註釋)?hibernate填充表如果爲空
我使用hibernate 3.2和spring 3.1。
在此先感謝!
什麼時候要填充表格?
我們檢查應用程序啓動時的數據庫狀態,並使用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.")
}
}
}
默認情況下,如果此類文件存在於類路徑的根目錄中,Hibernate會嘗試加載文件「import.sql」(或屬性hibernate.hbm2ddl.import_files指定的文件)的內容。所以,一個「解決方案」是創建一個只保存一個值的表,並且具有唯一的約束。當Hibernate嘗試加載文件時,由於唯一的約束,它將不能再次加載它。我沒有測試過這個,但我認爲它應該起作用。現在
,如果這聽起來對你不好(它確實對我來說),那麼我建議考慮看看是Hibernate使用導入此文件中的代碼:
我會將它作爲@Singleton @Startup EJB或上下文監聽器或類似的東西來實現。這個想法是每次應用程序啓動時運行它。然後代碼將檢查數據庫是否爲空,並在需要時導入SQL文件。