我目前正在使用具有读写表的数据库。
总是有两个具有相同模式的表,以数字作为后缀来区分,例如。 table1和table2。
现在,还有另一个来源,我从中得到当前的数字。我必须使用这个数字从相应的表中选择匹配的后缀。
现在,对于每个表,我有一个包含模式的@MappedSuperclass和两个通过@Table(name =“。1”)和@Table(name =“。。”)指定表名的实现类。
这个解决方案有效,但到现在为止我发现了许多缺点,并担心会有更多的缺点。还有另一种更好的解决方法吗?
不幸的是,我无法找到这种数据库机制的调用方式,因此我在互联网上找不到任何其他来源。
提前谢谢!
答案 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_ );
}
}