Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将单个实体类动态映射到多个表?_Java_Hibernate_Jpa_Orm - Fatal编程技术网

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

Java 如何将单个实体类动态映射到多个表?,java,hibernate,jpa,orm,Java,Hibernate,Jpa,Orm,由于与现有遗留代码和流程相关的各种原因,我希望能够使用Hibernate将单个实体类映射到具有相同结构的不同表。这些表是在运行时从另一个已知表动态创建的。例如,我将有以下课程: public class Item { private int id; private String label; ... } 这将映射到3个不同的表,ITEM1、ITEM2和ITEM3都具有相同的结构: CREATE TABLE ITEM[1|2|3] ( NUMBER id PRIM

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

public class Item {

   private int id;
   private String label;
    ...
}
这将映射到3个不同的表,
ITEM1
ITEM2
ITEM3
都具有相同的结构:

 CREATE TABLE ITEM[1|2|3] (
    NUMBER id PRIMARY KEY,
    VARCHAR label NOT NULL)
如上所述,表将根据一些外部配置/条件在运行时创建

我已就此复习了以下问题:

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

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


有谁有更多的经验实现这种动态映射吗?

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

让我们把你的问题分成两部分:

  • 是否可以将同一个类映射到多个表而无需子类化
  • 是否可以在运行时调整映射以适应新表
  • 答案是1。is:是的,如果不使用基于注释的映射,并且在不同实体名称下映射相同的类。您发布的第二个链接()暗示了该解决方案;您可以使用HBM文件,当然也可以使用编程配置。您必须使用更详细的save()、update()等重载,以便将实体名称指定为额外参数


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

    如果有关系,我是你提到的博客文章的作者

    让我们把你的问题分成两部分:

  • 是否可以将同一个类映射到多个表而无需子类化
  • 是否可以在运行时调整映射以适应新表
  • 答案是1。is:是的,如果不使用基于注释的映射,并且在不同实体名称下映射相同的类。您发布的第二个链接()暗示了该解决方案;您可以使用HBM文件,当然也可以使用编程配置。您必须使用更详细的save()、update()等重载,以便将实体名称指定为额外参数


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

    谢谢您的回答。与此同时,我开始按照你博客文章的一般思路来处理代码,并设法得到了1。正在工作,手动构造根类和映射。我从第2点和我自己的经验中了解到,不可能更改现有会话的映射,这可能是一个坏主意。我现在试图做的是从注释构建映射,并在开始使用之前对其进行调整:这将大大减少要编写的样板文件的数量。你在波托菲诺试过这个吗?很有趣!不,我们没有尝试,因为我们的输入是我们自己的xml模型格式,它描述了数据库的结构和映射。我们不映射到带注释的Java类,而是映射到hashmaps。然而,我们已经多次考虑过允许用户提供他们自己现有的注释类或hbm文件的可能性;我实际上放弃了这条路,因为我认为我们正试图在圆孔中插入方钉:Hibernate和一般的ORM对于映射实体很有用,而不是作为RDBMS的通用访问层。在我们的特殊情况下,最好使用普通JDBC访问来满足需求,而不依赖ORM,因为我们基本上使用DB作为消息队列的持久存储,每个使用者都有自己的队列映射到特定表。无论如何,谢谢你分享你的见解。嗯,这是有道理的。我们使用Hibernate是因为我们的产品是通用的,Hibernate提供了一个众所周知的API,并抽象了数据库系统之间的许多细微差异,而不排除在必要时使用直接SQL的可能性。然而,使用Hibernate并不是一个没有折衷的解决方案,对于某些特定的用例,它可能比好的旧JDBC更麻烦。你考虑过myBatis吗?我不知道它的第一手资料,但据推测它比Hibernate级别低,对纯SQL的使用更友好,同时还提供一些OO好处。是的,myBatis是一个很棒的工具,当它被称为iBatis时,我曾经使用过它。我觉得它简单有效,我宁愿