如何将单个实体类动态映射到多个表?

时间:2013-10-08 07:13:21

标签: java hibernate jpa orm

由于与现有遗留代码和流程相关的各种原因,我希望能够使用Hibernate将单个实体类映射到具有相同结构的不同表。这些表是在运行时从另一个已知表动态创建的。例如,我将拥有以下类:

public class Item {

   private int id;
   private String label;
    ...
}

将被映射为表示3个不同的表,ITEM1ITEM2ITEM3都具有相同的结构:

 CREATE TABLE ITEM[1|2|3] (
    NUMBER id PRIMARY KEY,
    VARCHAR label NOT NULL)

因为所述表将根据某些外部配置/条件在运行时创建。

我在SO上回顾了以下问题:

并且尽可能提出的解决方案(子类化)并不具有吸引力。这意味着在运行时动态类创建会产生一些黑魔法,如果可以的话,我宁愿避免使用它。

来自thisthis博客帖子我相信可以创建动态Hibernate映射,将同一个实体映射到多个表。

有没有人有更多实现这种动态映射的经验?

1 个答案:

答案 0 :(得分:4)

如果重要,我是你提到的博客文章的作者。

让我们将你的问题分解为两个:

  1. 是否可以将同一个类映射到多个表而不进行子类化?
  2. 是否可以在运行时调整映射以适应新表?
  3. 1.的答案是:是的,如果您不使用基于注释的映射,并且您在不同的实体名称下映射相同的类。您发布的第二个链接(How to map one class to different tables using hibernate/jpa annotations)暗示了该解决方案;您可以使用HBM文件,或者使用程序化配置。您将不得不使用更详细的save(),update()等重载,这些重载允许将实体名称指定为额外参数。

    2.答案是:是和否;您可以使用新映射和旧映射重建一个全新的SessionFactory(正如我们在Portofino中所做的那样),但是您无法以编程方式将新映射添加到现有的SessionFactory。这意味着,您必须在某一时刻关闭所有现有会话,处理旧的SessionFactory,构建新的SessionFactory并开始使用它。换句话说,是的,您可以在运行时执行此操作,但不能与同一会话工厂的其他用途无缝地同时执行。您当然可以使用多个SessionFactories来分割映射或提供冗余映射并处理优雅的更新方案;这实际上取决于你的要求。