2013-04-03 53 views
0

Hibernate屬性 - hibernate.hbm2ddl.import_files - 只會在 - hibernate.hbm2ddl.auto - 被設置爲創建時觸發。使Hibernate在系統啓動時插入數據

是否有任何實現「改變」的?

不是hibernate.hbm2ddl.import_files行爲的方式......而是一種Hibernate在系統啓動後插入一些數據(即使創建表)的方式。 執行純SQL腳本將不符合我的需要,因爲@Id @GeneratedValue不受尊重。

最後,我需要的是一種讓系統檢測數據庫中是否存在某些數據的方法,如果不存在,請填寫它。有沒有人知道這樣做,並尊重我的@GeneratedValue計數器?

回答

2

除了elias提出的正確答案之外,您還可以添加ServletContextListener,因爲它可能是實現您的功能的更清晰的方法。爲此,您需要實現ServletContextListener接口並使用@WebListener對類進行註釋,或者在web.xml中聲明它。

public class MyServletContextListener implements ServletContextListener { 

@Override 
public void contextInitialized(ServletContextEvent sce) { 
    initializeDatabase(); 
} 

@Override 
public void contextDestroyed(ServletContextEvent sce) { } 

} 

那麼你要麼必須在web.xml中添加聲明:

<listener> 
    <listener-class>yourpackage.MyServletContextListener</listener-class> 
</listener> 

,或者,如果您目前所的Servlet 3.0,就註解你的類@WebListener

+0

+1確實更清潔! :) – elias 2013-04-04 12:05:41

+0

@elias在同一時間,我已經upvoted你的答案,因爲它絕對是更聰明:)另外,我真的很高興有多麼惡作劇已知的情況可能會被證明是! – skuntsel 2013-04-04 13:11:38

+0

對!我應該更好地瞭解這些API。 :)但是,當我使用這個技巧時,我想我真的想要一個應用程序範圍的bean,因爲它也會設置一些屬性和消息,這些消息稍後會顯示在視圖中 - 這樣很方便。 – elias 2013-04-04 16:41:09

2

您可以創建一個調用將數據插入數據庫的方法的託管bean。

@ManagedBean(eager = true) 
@ApplicationScoped 
public class App { 

    @PostConstruct 
    public void init() { 
     myDAO.initDatabaseIfNeeded(); 
    } 
} 

的方法myDao.initDatabaseIfNeeded()當應用程序初始化被調用,之後的任何依賴關係解決 - 因此之後的任何表已經由Hibernate創建了。

我最近在Spring應用程序上做了類似的事情,所以在我的例子中,myDAO實際上是一個Spring服務。

相關問題