2013-01-15 49 views
1

在我的應用程序中,我使用Spring上下文和JPA。我有一些註釋爲@Entity的實體集合,它們的表格在系統啓動時自動創建。最近我開始使用Spring ACL,所以我必須有following additional DB schema,我不希望這些表映射到實體(我不需要它們,因爲Spring ACL獨立管理它們)。JPA + Spring如何使用自定義表格和數據初始化數據庫

  1. 我想自動插入例如admin用戶帳號轉換爲 User的實體表。如何正確地做到這一點?
  2. 我想在系統啓動時初始化Spring ACL自定義表,但SQL腳本文件似乎不是很好的解決方案,因爲如果我使用不同的數據庫進行生產和功能測試,不同的SQL方言不允許我執行腳本正確地在兩個引擎上(例如,當使用MySQL和HSQL時)。

起初,我試圖用ServletListener這個servlet初始化期間檢查數據庫,並增加了必要的數據和架構,但這並不集成測試工作(因爲沒有在所有涉及的servlet)。

我想實現的是在JPA初始化所有實體表之後啓動的Spring bean(?),使用注入的DAO插入所有啓動數據並以某種方式創建Spring ACL模式。然後 - 我想從IoC中移除bean(因爲我不再需要它)。可能嗎?

或者有沒有更好的方法來做到這一點?

+0

您使用哪種JPA提供程序,Eclipse Link,Hibernate還是其他? – Ralph

+0

我使用eclipselink。 – fracz

回答

1

如果您使用的是EclipseLink,則可以使用SessionEventListener在JPA登錄後執行代碼。您可以在postLogin事件中執行您的模式創建和設置。

您可以使用EclipseLink中的架構框架(org.eclipse.persistence.tools.schemaframework)以獨立於數據庫平臺的方式創建表和DDL。(TableDefinition,SchemaManager類)

+0

該解決方案非常依賴技術(eclipselink),但似乎是我正在尋找的。我會試試看。 – fracz

0

如果您使用hibernate,則在類路徑根中創建一個sql腳本import.sql。 Hibernat將在啓動時執行它。 - 這工作在以前的休眠版本。在當前版本4.1的文檔中,我沒有發現任何此功能的提示。

但是Hibernate的4.1有其他功能

物業:hibernate.hbm2ddl.import_files

包含SessionFactory的創建過程中執行的SQL DML語句的可選文件的逗號分隔的名字。這對於測試或演示非常有用:例如,通過添加INSERT語句,您可以在部署時使用最少量的數據填充數據庫。 文件順序很重要,一個提交文件的語句在下列文件的語句之前執行。這些語句僅在架構創建時才執行,即如果hibernate.hbm2ddl.auto設置爲create或create-drop。

例如/humans.sql,/dogs.sql

0

你可以嘗試使用flyway

  • 創建使用SQL DDL的表作爲SQL遷移和
  • 使用SQL或Java可能把表中的一些數據基礎遷移。如果需要環境或其他信息,您可能需要使用後者。

這聽起來比聽起來容易很多,而且如果不是必須的話,你最終還是會將飛路本身作爲獎勵。

1

我使用PostConstruct註釋來調用初始化方法。

正如文檔所述:PostConstruct註釋用於需要在執行依賴注入以執行任何初始化之後執行的方法。您可以簡單地添加一個彈簧箱,其中包含@PostConstruct註釋的方法,這些方法將在創建表(或者我們可以說,在其他bean準備好之後執行)之後執行。

代碼示例:

@Component 
public class EntityLoader { 

    @Autowired 
    UserRepository userRepo; 

    @PostConstruct 
    public void initApiUserData() { 
     User u = new User(); 
     // set user properties here 
     userRepo.save(u); 
    } 

} 
相關問題