在运行时更改实体的表名?

时间:2010-10-07 07:41:45

标签: java hibernate orm jpa jpa-2.0

这个表是按月生成的。基本上所有月度表的表结构都是相同的。

由于使用不同的表名映射同一个实体需要做很多工作,

是否可以在运行时更改实体的表名,因为它们毕竟具有相同的表结构?

   @Entity
   @Table(name="FOO_JAN2010") // any other ways to generate this dynamically?
   public class FooJan2010Table {  // if we can dynamically set the table name this can be simply named FooTable
       ...
   }

如果没有,你能提出什么方法?

4 个答案:

答案 0 :(得分:7)

  

是否可以在运行时更改实体的表名,因为它们毕竟具有相同的表结构?

这实际上是不可能的,至少不是标准的JPA(这并不意味着我用非标准的JPA做过),如下所述:

总而言之,JPA没有提供一种方法来“改变”已经初始化的持久性单元的给定实体(以及相关的预编译CRUD查询,预编译的命名查询等)。

尽管如此,由于您正在使用Hibernate,因此可以查看http://www.hibernate.org/171.html以了解使用Hibernate Core API可能实现的目标。

我能想到的另一个选择是使用数据库同义词 / 别名FOO将是FOO_JAN2010的别名,直到。{ ..您将别名更改为FOO_FEB2010上的点。我从未测试过这个,我不知道它是否适合你的需求。但这是另一个想法。

答案 1 :(得分:5)

如果您使用Hibernate作为JPA提供程序,可以使用Naming Strategies执行此操作。请参阅my answer to this previous question以供参考。

您应该能够设计命名策略以动态方式返回表名。

应该这样做的问题是完全不同的。

另外,感谢Pascal提醒我,这只有在每月重新创建一次EntityManagerFactory时才有效(有很多方法可以做到这一点,重新启动webapp是最简单的)

答案 2 :(得分:1)

我无法想象一个好方法来映射这个。如果这是遗留数据库,您将很难使用JPA来访问它。

但是,如果数据库布局在您的控制之下,那么我会更改它。拥有完全相同布局的多个表通常是糟糕的设计。通过只有一个表具有年和月的额外列,您可以获得相同的结果。不要忘记在两列上放一个索引。

答案 3 :(得分:0)

我也想不出这个,有类似的要求。

由于我的表名相对不经常更改(每天),我最终在RDBMS(我正在使用DB2)的“active”表中定义了一个DB别名,并在@Table注释中引用了表别名。

我完全清楚这不是OP所要求的,但我想我会分享经验。