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