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

2022-09-01 23:44:37

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

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

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

   @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
       ...
   }

如果没有,您能建议什么方法?


答案 1

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

这实际上是不可能的,至少对于标准JPA来说是不可能的(这并不意味着我用非标准JPA做到了这一点),正如以下问题中提到的:

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

不过,由于您正在使用Hibernate,因此也许可以查看 http://www.hibernate.org/171.html 以了解使用Hibernate Core API的可能性。

我能想到的另一种选择是使用数据库同义词/别名:这将是一个别名,直到...将别名更改为 指向 。我从来没有测试过这个,我不知道它是否适合你的需求。但这是另一个想法。FOOFOO_JAN2010FOO_FEB2010


答案 2

如果您使用Hibernate作为JPA提供程序,则可以使用命名策略来执行此操作。请参阅我对上一个问题的回答以供参考。

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

不过,你是否应该这样做的问题是一个完全不同的问题。

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


推荐