2015-08-26 38 views
1

當我使用IntelliJ從存在數據庫模式生成持久性映射時,它將catalog值作爲@Table註釋的一部分。不幸的是,數據庫實例的名稱中有dev/test/prod environemnts的名稱,雖然我可以用傳遞給EntityManagerFactory的映射覆蓋連接字符串,但在對BAR_TEST實例執行查詢時仍然會得到Invalid object name 'BAR_DEV.dbo.FOO'如何覆蓋JPA實體的@ Table.catalog值?

我可以在運行時動態覆蓋catalog的值,而無需執行全局搜索,並在生成實體後進行替換以手動刪除它?

@Entity 
@Table(name = "FOO", schema = "dbo", catalog = "BAR_DEV") 
public class Foo{ /* ... */ } 
+1

或使用orm.xml,其中一個值爲dev,一個用於測試,另一個用於prod。 –

+0

恐怕你運氣不好http://stackoverflow.com/questions/3879607/change-table-name-of-an-entity-on-runtime –

回答

1

不,它不可能直接使用標準JPA。

但是,我在我的項目中使用的解決方案是定義多個持久性單元,每個用於特定的環境。您可以覆蓋orm.xml文件中的任何數據庫映射,甚至可以爲所有實體設置默認目錄或模式。下一步是動態檢索適當的EntityManager - 如果您使用的是Java EE,我建議使用@Inject注入並創建一個生產者,它將爲特定環境返回特定的EM。

0

非便攜式,僅Eclipselink org.eclipse.persistence.dynamic.DynamicHelper.SessionCustomizer可以在運行時取代許多默認值。

編輯:我還沒有準備好你的代碼。我用這種方法

public void customize(Session session) throws SQLException { 
     ... 
    for (ClassDescriptor descriptor : session.getDescriptors().values()) { 

       if (!descriptor.getTables().isEmpty() && descriptor.getAlias().equalsIgnoreCase(descriptor.getTableName())) { 
      tableName = TABLE_PREFIX + clazz.getSimpleName(); 
    descriptor.setTableName(tableName); 
    } 
    }