【问题标题】:Use variable in JPA Annotation for a tablename在 JPA 注释中使用变量作为表名
【发布时间】:2012-11-19 17:36:21
【问题描述】:

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

【问题讨论】:

  • 可以将大型表的性能索引到列中的值范围内,例如每月或每年。如果表中有日期列,则可以为该列中的值创建多个索引,每个月的日期范围一个索引。根据您最常访问信息的方式使用索引。这就是您解决数据库效率问题的方法——而不是通过创建多个破坏规范化的表!
  • @ADTC 所说的。每当我听到包含可变数量表的数据库模式时,我就知道有人缺少基本的关系数据库原则。

标签: class jpa dynamic entity tablename


【解决方案1】:

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

【讨论】:

  • 感谢您的回复!最初,数据位于单个表中。这张桌子的尺寸变得越来越大,使得访问变得困难(这些实际上是卡车的地理位置)。这迫使我们在月表中削减表
  • 如果表在年份和月份上被正确索引,访问它应该不会比访问仅包含一个月数据的单个表慢得多。检查您的表索引。
【解决方案2】:

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

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

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

另外,一些数据库如Oracle支持表分区,这样你就不需要每个月新的物理表了。

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

【讨论】:

    【解决方案3】:

    在运行时更改映射是不可能的。在您的情况下,您可以将所有表合并为一个,并使用 @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     
    }
    

    【讨论】:

    • 拜托,你能举例说明一下吗?谢谢!
    • 感谢您的详细信息。请在我的情况下,这些表是在每个月底创建的,并且会随着时间的推移而持续!
    猜你喜欢
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2011-05-05
    • 1970-01-01
    • 2016-06-04
    • 2021-10-22
    相关资源
    最近更新 更多