Java 如何将单个实体类动态映射到多个表?
由于与现有遗留代码和流程相关的各种原因,我希望能够使用Hibernate将单个实体类映射到具有相同结构的不同表。这些表是在运行时从另一个已知表动态创建的。例如,我将有以下课程: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
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)
如上所述,表将根据一些外部配置/条件在运行时创建
我已就此复习了以下问题:
有谁有更多的经验实现这种动态映射吗?如果这很重要,我是你提到的博客文章的作者 让我们把你的问题分成两部分:
答案是2。是:是和否;您可以使用新映射和旧映射一起重建一个全新的SessionFactory(就像我们在中所做的那样),但是您不能以编程方式向现有SessionFactory添加新映射。这意味着您将不得不关闭所有现有会话,处理旧的SessionFactory,构建新的SessionFactory并开始使用它。换句话说,是的,您可以在运行时这样做,但不能与同一会话工厂的其他用途同时无缝地进行。当然,您可以使用多个SessionFactories来分割映射,或者提供冗余映射并处理优雅的更新方案;这取决于你的要求。如果有关系,我是你提到的博客文章的作者 让我们把你的问题分成两部分:
答案是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时,我曾经使用过它。我觉得它简单有效,我宁愿