Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 动态更改表名_Mysql_Hibernate_Jpa_Jakarta Ee - Fatal编程技术网

Mysql 动态更改表名

Mysql 动态更改表名,mysql,hibernate,jpa,jakarta-ee,Mysql,Hibernate,Jpa,Jakarta Ee,我目前正在使用一个具有读写表的数据库 总是有两个表具有相同的模式,以数字作为后缀进行区分,例如table1和table2 现在,我从另一个来源获得当前数字。我必须使用这个数字从相应的表中选择匹配的后缀 现在,对于每个表,我都有一个@MappedSuperclass,其中包含模式和两个实现类,它们通过@table(name=“…1”)和@table(name=“…2”)指定表名 这个解决方案是可行的,但是现在我发现了很多缺点,并且担心会有更多的缺点。有没有其他更好的方法来解决这个问题 不幸的是,我

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

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

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

现在,对于每个表,我都有一个@MappedSuperclass,其中包含模式和两个实现类,它们通过@table(name=“…1”)和@table(name=“…2”)指定表名

这个解决方案是可行的,但是现在我发现了很多缺点,并且担心会有更多的缺点。有没有其他更好的方法来解决这个问题

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


提前谢谢你

最明显的解决方案:

    if ( num == 1 )
    {
      Table1 table1 = createTable1();
      table1.set...;
      entityManager.persist( table1 );
    } else
    {
      Table2 table2 = createTable2();
      table2.set...;
      entityManager.persist( table2 );
    }
或者通过名称调用构造函数(使用Lombok注释):

@实体
@资料
公共类公共基
{}
@实体
@资料
公共类Table1扩展了CommonBase
{}
@实体
@资料
公共类表2扩展了CommonBase
{}
@无国籍
@本地豆
公共类CommonBaseBean
{
@注入
专用公共总线公共总线;
受保护的无效客户端代码()
{
Table0T0=(Table0)commonBaseBUS.createEntityByIndex(0);
t0.设置…();
公共总线的持久性(t0);
表1 t1=(表1)commonBaseBUS.createEntityByIndex(1);
t1.集…();
公共总线的持久性(t1);
}
}
@依赖的
类公共总线
{
@注入
私有公共基础公共基础;
@塞特
私有字符串entityBaseName=“qualified.path.Table”;
公共CommonBase createEntityByIndex(int index_)引发ClassNotFoundException
{
字符串entityName=entityBaseName+Integer.toString(索引);
返回createEntityByName(entityName);
}
公共无效持久性(CommonBase cb_)
{
commonBaseDAL.persistEntity(cb_);
}
受保护的CommonBase createEntityByName(字符串entityName_389;)引发ClassNotFoundException
{
Class c=Class.forName(entityName_u2;);
尝试
{
return(CommonBase)c.newInstance();
}
catch(实例化异常| IllegalAccessException ex)
{
抛出新的ClassNotFoundException();
}
}
}
@依赖的
公共基类
{
@持久上下文
私人实体管理者;
公共无效持久性(CommonBase cb_)
{
em.persistenty(cb_);
}        
}

这是旧系统还是什么?像这样使用表命名没有多大意义,这可能就是为什么你找不到很多关于它的信息。您是否有可能重新设计以不使用两个不同的表?不幸的是,没有。我必须按设计使用数据库。虽然这段代码可能会回答这个问题,但提供有关这段代码为什么和/或如何回答这个问题的附加上下文可以提高其长期价值。这是我想要避免的明显解决方案。我最终使用了超类。唯一需要实际实现的是jpa entitymanager,我正在通过硬编码枚举解析这些类。您可以为它们使用超类,但我不知道:是否有任何公共属性?如果不是,那是个坏主意。错误的设计决定。@Benjamin W:如果我告诉你我完全理解这个问题的重点,我是不会诚实的。但我不想贬低它。
@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_ );
  }        
}