我有一个动态创建表的数据库(这些表具有相同的结构,但它们的名称后缀为年份,后跟当前月份的数字:data201201,data201202,data201203 ......) 我创建了一个名为Data的实体类,它定义了这些表的结构。我不知道如何动态使用它。 拜托,我希望你能帮助我! 谢谢!
答案 0 :(得分:1)
如果没有为每个表创建一个类,这是不可能的,但这个想法和每个月都有一个表一样糟糕。最好的建议是通过将所有信息存储在具有year
和month
列的单个表中来规范化您的架构。
答案 1 :(得分:1)
您或许可以使用EclipseLink的动态实体或每个租户支持的多租户表。
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Dynamic
http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_multitenant.htm
此外,某些数据库(如Oracle)支持表分区,因此您每个月不需要新的物理表。
您还可以定义一个视图,该视图可以选择当前月份,联合相关月份以及映射到视图。
答案 2 :(得分:0)
在运行时无法更改映射。在您的情况下,您可以将所有表格合并为一个,并使用@Inheritance和@DiscriminatorColumn的组合
编辑
你结合表是
GLOBAL_DATE_TABLE
{
number : ID
varchar : MONTH <- this will be discriminator column
varchar : NAME
... all another fields
}
您的映射
@Entity
@Table(name="GLOBAL_DATE_TABLE")
@Inheritance(strategy=SINGLE_TABLE)
@DiscriminatorColumn(name="MONTH", discriminatorType=STRING)
public class Date
{
@Column(name = "ID")
@Id
private long id;
@Column(name = "NAME")
private String name;
// another fields
}
@Entity
@DiscriminatorValue("data201201")
public class Data201201
{
// if column MONTH contains value "ata201201" this instance will be created
// logic for this table here
}
@Entity
@DiscriminatorValue("data201202")
public class Data201202
{
// if column MONTH contains value "ata201202" this instance will be created
// logic for this table here
}
@Entity
@DiscriminatorValue("data201203")
public class Data201203
{
// if column MONTH contains value "ata201203" this instance will be created
// logic for this table here
}