Java Hibernate中n个表到1个类的运行时单向映射

Java Hibernate中n个表到1个类的运行时单向映射,java,hibernate,mapping,orm,sessionfactory,Java,Hibernate,Mapping,Orm,Sessionfactory,我在不同的表中有数据,但在同一个数据库中,所有这些表都具有相同的模式。根据一些运行时变量,我想选择在查询Hibernate时使用哪个表。这可能吗 请注意,我只使用Hibernate将表数据读取到对象 解决方案(我认为)是每个表一个*.hbm.xml-文件,每个表一个SessionFactory: ClassTable1.hbm.xml: <class name="Class" table="table1">...</class> ClassTable2.hbm.xml:

我在不同的表中有数据,但在同一个数据库中,所有这些表都具有相同的模式。根据一些运行时变量,我想选择在查询Hibernate时使用哪个表。这可能吗

请注意,我只使用Hibernate将表数据读取到对象

解决方案(我认为)是每个表一个
*.hbm.xml
-文件,每个表一个SessionFactory:

ClassTable1.hbm.xml: <class name="Class" table="table1">...</class>
ClassTable2.hbm.xml: <class name="Class" table="table2">...</class>
ClassTable3.hbm.xml: <class name="Class" table="table3">...</class>

HibernateUtil.java:
    getSessionFactoryTable1() {...} // load mapping ClassTable1.hbm.xml
    getSessionFactoryTable2() {...} // load mapping ClassTable2.hbm.xml
    getSessionFactoryTable3() {...} // load mapping ClassTable3.hbm.xml
ClassTable1.hbm.xml:。。。
ClassTable2.hbm.xml:。。。
ClassTable3.hbm.xml:。。。
HibernateUtil.java:
getSessionFactoryTable1(){…}//加载映射类Table1.hbm.xml
getSessionFactoryTable2(){…}//加载映射类Table2.hbm.xml
getSessionFactoryTable3(){…}//加载映射类Table3.hbm.xml
丑陋的。特别是考虑到
*hbm.xml
-文件之间的唯一区别是table属性


有没有更奇特的方法?理想情况下,使用一个
Class.hbm.xml

可以使用注释而不是在hbm.xml文件中定义类吗?您可能可以编写一个定义所有列映射的基类(因为您说过它们不会更改),然后为每个“table1”、“table2”、“table3”场景扩展一次,其中每个子类都有一个指向该类的正确表的不同注释。可能有用

根据一些运行时变量,我想选择在查询Hibernate时使用哪个表

如果您要问这种类型的问题,那么这告诉我Hibernate可能不是适合您的用例的最佳工具


作为一个简单的解决方案,为什么不在HibernateUtil.getSessionFactory()方法中以编程方式控制配置中使用哪些hbm.xml文件呢?Hibernate配置对象。

很遗憾,我也遇到过类似的情况。我需要对分布在200个表中的实体进行只读访问,这些表具有相同或易于协调的模式。通过将表合并到一个实体映射的视图中,我避免了实际解决这个问题。如果在你的情况下这是现实的,你可能想考虑一下。否则,我会有兴趣看看人们有什么解决方案……谢谢,如果使用Hibernate,这听起来可能是最不坏的解决方案。我要试一试!顺便说一句,如果您知道其他更适合的工具,请发表评论:)@Emore,Hibernate是一个很棒的ORM工具,但它确实非常出色,旨在管理对象的整个生命周期—创建、更新和读取。如果您只需要读取对象,那么可能是在用大锤敲打苍蝇——Spring的JdbcTemplate和iBatis SqlMaps是另外两个可能更轻量级的选项。在这两种方法中,基本上都是指定要运行的SQL查询,然后指定从resultset中的列到objectsAh中的字段的映射(在SpringJDBCTemplate中,通常在代码中;在iBatis中,通常在XML中),我明白了。我肯定会仔细阅读这些内容,尽管出于学习和一致性的原因,我可能会继续使用Hibernate。谢谢有趣。我没有想到这一点。然而,我相信这会导致不同的分类;每张桌子一张?