Hibernate将具有动态名称的不同表映射到同一个java类

时间:2012-02-02 14:51:47

标签: hibernate class runtime

我有一些oracle表,如table1,表2,表n具有相同的结构。 如果我在运行应用程序之前知道我有多少表,我可以将一些<class>标签与相同的类名但不同的表名和相关的实体名称(复制属性标签映射)放在一起。 但我不知道编译时的所有表名;当应用程序运行时,它知道我有多少个表:是否可以在查询时设置表名? 我的所有表都像前缀(表)加后缀(1,2,3,n),但我知道运行时的n限制。 我必须逐个查询所有表格来填充地图。

这是我的Bucket.hbm.xml

的一个例子

我不确定我的解释是否清楚:

我有这个Bucket.hbm.xml

<hibernate-mapping>
    <class name="com.Bucket" table="BUCKETTABLE1" entity-name="Buckettable1">
        <cache usage="read-only"/>
        <id name="id" type="long">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="value" type="java.lang.String">
            <column name="VALUE" />
        </property>
    </class>
    <class name="com.Bucket" table="BUCKETTABLE2" entity-name="Buckettable2">
        <cache usage="read-only"/>
        <id name="id" type="long">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="value" type="java.lang.String">
            <column name="VALUE" />
        </property>
    </class>
    <class name="com.Bucket" table="BUCKETTABLE3" entity-name="Buckettable3">
        <cache usage="read-only"/>
        <id name="id" type="long">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="value" type="java.lang.String">
            <column name="VALUE" />
        </property>
    </class>
</hibernate-mapping>

我想避免这种重复,我不想硬编码所处理的表的数量。

1 个答案:

答案 0 :(得分:0)

回答问题

for (int i = 0; i < tablecount; i++)
{
    // %number% is a placeholder in the mapping for the table and the entity name
    configuration.add(templatemapping.replace("%number%", i);
}

也许你可以通过

来简化使用
class Entity implements Someinterface

session.createCriteria(Someinterface.class);

nhibernate尝试查找实现该接口的所有映射类,并在所有表上执行UNION。也许它也可以在不同的实体名称上使用相同的类。然后不知道有多少表:

Entity allNtablesTogether = session.createCriteria(Someinterface.class).list();
相关问题