动态更改表名称

时间:2016-03-05 16:18:30

标签: mysql hibernate jpa java-ee

我目前正在使用具有读写表的数据库。

总是有两个具有相同模式的表,以数字作为后缀来区分,例如。 table1和table2。

现在,还有另一个来源,我从中得到当前的数字。我必须使用这个数字从相应的表中选择匹配的后缀。

现在,对于每个表,我有一个包含模式的@MappedSuperclass和两个通过@Table(name =“。1”)和@Table(name =“。。”)指定表名的实现类。

这个解决方案有效,但到现在为止我发现了许多缺点,并担心会有更多的缺点。还有另一种更好的解决方法吗?

不幸的是,我无法找到这种数据库机制的调用方式,因此我在互联网上找不到任何其他来源。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

最明显的解决方案:

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

或者使用构造函数按名称调用(使用Lombok注释):

@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_ );
  }        
}