2016-03-05 96 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

您可以为它们使用超类,但我不知道:是否有任何常用属性?如果不是,这是一个坏主意。错误的设计决定。 –