1

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

4

3 回答 3

1

您可以为此使用 EclipseLink 的动态实体或每个租户支持的多租户表。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Dynamic

http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_multitenant.htm

此外,某些数据库(例如 Oracle)支持表分区,因此您不需要每月创建新的物理表。

您还可以定义一个从当前月份中选择的视图,以联合相关月份,并映射到该视图。

于 2012-11-20T14:35:03.920 回答
1

不为每个表创建一个类是不可能的,但这与每个月都有一个表一样糟糕。最好的建议是通过将所有信息存储在具有一个year和一个month列的单个表中来规范您的模式。

于 2012-11-19T19:19:54.867 回答
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     
}
于 2012-11-19T20:11:14.350 回答