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

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

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

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

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

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

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

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

  • 在@Table(name =“tableName”)中 – 使“tableName”成为JPA中的变量
  • JPA:如何在运行时指定与类对应的表名?
  • Hibernate或iBatis还是其他什么?

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

不过,既然您正在使用Hibernate,可以查看http://www.hibernate.org/171.html ,了解使用Hibernate Core API可能实现的目标。

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

如果您将Hibernate用作JPA提供程序,则可以使用命名策略 执行此操作。 请参阅我之前的问题的答案以供参考。

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

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

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

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

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

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

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

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