在JPA Annotation中使用变量作为表名

时间:2012-11-19 17:36:22

标签: class jpa dynamic entity tablename

我有一个动态创建表的数据库(这些表具有相同的结构,但它们的名称后缀为年份,后跟当前月份的数字:data201201,data201202,data201203 ......) 我创建了一个名为Data的实体类,它定义了这些表的结构。我不知道如何动态使用它。 拜托,我希望你能帮助我! 谢谢!

3 个答案:

答案 0 :(得分:1)

如果没有为每个表创建一个类,这是不可能的,但这个想法和每个月都有一个表一样糟糕。最好的建议是通过将所有信息存储在具有yearmonth列的单个表中来规范化您的架构。

答案 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     
}