2016-03-05 89 views
2

我目前正在使用具有讀取和寫入表的數據庫。動態更改表名

總是有兩個表具有相同的模式,用數字作爲後綴來區分,例如。 table1和table2。

現在,還有另一個來源,我從中獲得當前數字。我必須用這個數字從相應的表格中選擇匹配的後綴。

現在,對於每個表,我有一個@MappedSuperclass,它包含模式和兩個實現類,通過@Table(name =「..1」)和@Table(name =「..2」)指定表名。 。

此解決方案的工作原理,但現在我發現了很多缺點,並擔心會有更多。有另一種更好的方法來解決這個問題嗎?

不幸的是,我找不到這種數據庫機制被稱爲,因此我無法在互聯網上找到任何其他來源。

預先感謝您!

+1

這是一個遺留系統還是什麼?使用這種表格命名沒有多大意義,這可能是爲什麼你無法找到很多信息。你有可能重新設計不使用兩個不同的表? –

+0

不幸的不是。我必須按照設計使用數據庫.. – Henry

回答

1

最明顯的解決方案:

if (num == 1) 
    { 
     Table1 table1 = createTable1(); 
     table1.set...; 
     entityManager.persist(table1); 
    } else 
    { 
     Table2 table2 = createTable2(); 
     table2.set...; 
     entityManager.persist(table2); 
    } 

或者與調用構造函數的名字(與龍目島的註釋):

@Entity 
@Data 
public class CommonBase 
{} 

@Entity 
@Data 
public class Table1 extends CommonBase 
{} 

@Entity 
@Data 
public class Table2 extends CommonBase 
{} 

@Stateless 
@LocalBean 
public class CommonBaseBean 
{ 
    @Inject 
    private CommonBaseBUS commonBaseBUS; 

    protected void clientCode() 
    { 
    Table0 t0 = (Table0) commonBaseBUS.createEntityByIndex(0); 
    t0.set...(); 
    commonBaseBUS.persisEntity(t0); 

    Table1 t1 = (Table1) commonBaseBUS.createEntityByIndex(1); 
    t1.set...(); 
    commonBaseBUS.persisEntity(t1); 
    } 
} 

@Dependent 
class CommonBaseBUS 
{ 
    @Inject 
    private CommonBaseDAL commonBaseDAL; 

    @Setter 
    private String entityBaseName = "qualified.path.Table"; 

    public CommonBase createEntityByIndex(int index_) throws ClassNotFoundException 
    { 
    String entityName = entityBaseName + Integer.toString(index_); 
    return createEntityByName(entityName); 
    } 

    public void persisEntity(CommonBase cb_) 
    { 
    commonBaseDAL.persistEntity(cb_); 
    } 

    protected CommonBase createEntityByName(String entityName_) throws ClassNotFoundException 
    { 
    Class<?> c = Class.forName(entityName_); 
    try 
    { 
     return (CommonBase) c.newInstance(); 
    } 
    catch (InstantiationException | IllegalAccessException ex) 
    { 
     throw new ClassNotFoundException(); 
    } 
    } 
} 

@Dependent 
class CommonBaseDAL 
{ 
    @PersistentContext 
    private EntityManager em; 

    public void persisEntity(CommonBase cb_) 
    { 
    em.persistEntity(cb_); 
    }   
} 
+0

雖然此代碼可能會回答問題,但提供有關* why *和/或* how *代碼如何回答問題的其他上下文可提高其長期價值。 –

+0

這是我想避免的顯而易見的解決方案。我結束了使用超類。唯一需要實際實現的是jpa entitymanager,我通過硬編碼的枚舉來解析這些類 – Henry

+0

您可以爲它們使用超類,但我不知道:是否有任何常用屬性?如果不是,這是一個壞主意。錯誤的設計決定。 –