2

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

public class Item {

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

这将被映射到 3 个不同的表,ITEM1ITEM2并且ITEM3都具有相同的结构:

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

正如所述表将根据一些外部配置/条件在运行时创建。

我已经审查了关于 SO 的以下问题:

并且建议的解决方案(子类化)虽然可能并不吸引人。这意味着运行时动态类创建的一些黑魔法,如果可以的话,我宁愿避免。

这个这个博客文章中,我相信可以创建动态的 Hibernate 映射,它将同一个实体映射到多个表。

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

4

1 回答 1

4

万一这很重要,我是你提到的博客文章的作者。

让我们将您的问题分为两部分:

  1. 是否可以将同一个类映射到多个表而不进行子类化?
  2. 是否可以在运行时调整映射以适应新表?

1. 的答案是:是的,如果您不使用基于注释的映射,并且您将同一类映射到不同的实体名称下。您发布的第二个链接(How to map one class to different tables using hibernate/jpa annotations)暗示了该解决方案;您可以使用 HBM 文件,当然也可以使用编程配置。您必须使用更详细的 save()、update() 等重载,这些重载允许将实体名称指定为额外参数。

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

于 2013-10-31T10:56:07.530 回答