在运行时更改实体的表名?
这个表是按月生成的。 基本上所有月度表的表结构都是相同的。
因为使用不同的表名映射同一个实体需要做很多工作,
是否可以在运行时更改实体的表名,因为它们具有相同的表结构?
@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所要求的,但我想我会分享经验。
- hibernate session.flush with spring @transactional
- 使用Java Hibernate进行会话管理
- Java Hibernate Transformer AliasToBeanNestedResultTransformer
- 添加两个变量后BeanCreationException
- java.lang.NoSuchMethodError:javax.persistence.JoinColumn.foreignKey
- Hibernate和JPA有什么区别?
- Hibernate:选择其中包含所有指定valus的实体
- Hibernate多对一更新外键为null
- org.hibernate.Session.clear()被认为有害吗?