我有一张桌子的用户


CREATE TABLE "USERS" (
    "ID" NUMBER NOT NULL ,
    "LOGINNAME" VARCHAR2 (150) NOT NULL )


我还有第二张表SpecialUsers。在SpecialUsers表中不能出现两次UserId,并且在SpecialUsers表中仅包含Users表中一小部分用户ID。


CREATE TABLE "SPECIALUSERS" (
    "USERID" NUMBER NOT NULL,
 CONSTRAINT "PK_SPECIALUSERS" PRIMARY KEY ("USERID") )

ALTER TABLE "SPECIALUSERS" ADD CONSTRAINT "FK_SPECIALUSERS_USERID" FOREIGN KEY ("USERID")
REFERENCES "USERS" ("ID")
/


在Hibernate中映射Users表工作正常


<hibernate-mapping package="com.initech.domain">
    <class name="com.initech.User" table="USERS">

        <id name="id" column="ID" type="java.lang.Long">
            <meta attribute="use-in-tostring">true</meta>
            <generator class="sequence">
                <param name="sequence">SEQ_USERS_ID</param>
            </generator>
        </id>

        <property name="loginName" column="LOGINNAME" type="java.lang.String" not-null="true">
            <meta attribute="use-in-tostring">true</meta>
        </property>

    </class>
</hibernate-mapping>


但是我正在努力为SpecialUsers表创建映射。我发现Internet中的所有示例(例如Hibernate文档中的示例)都没有这种类型的自引用。我尝试过这样的映射:


<hibernate-mapping package="com.initech.domain">
    <class name="com.initech.User" table="SPECIALUSERS">

        <id name="id" column="USERID">
            <meta attribute="use-in-tostring">true</meta>
            <generator class="foreign">
                <param name="property">user</param>
            </generator>
        </id>

        <one-to-one name="user" class="User"/>

    </class>
</hibernate-mapping>



但是得到了错误


Invocation of init method failed; nested exception is org.hibernate.DuplicateMappingException:
Duplicate class/entity mapping com.initech.User 


我应该如何映射SpecialUsers表?在应用程序级别上,我需要的是SpecialUsers表中包含的User对象的列表。

最佳答案

我应该如何映射SpecialUsers表?


根据USERSSPECIALUSERS表的结构,您具有Table per subclass层次结构,完全可以使用Hibernate映射这种层次结构。

首先,确保SpecialUser在对象模型级别从User继承(这是继承关系,而不是自引用)。

public class SpecialUser extends User {
}


然后,在<joined-subclass>的映射中声明一个User元素:

<hibernate-mapping package="com.initech.domain">
    <class name="com.initech.User" table="USERS">

        <id name="id" column="ID" type="java.lang.Long">
            <meta attribute="use-in-tostring">true</meta>
            <generator class="sequence">
                <param name="sequence">SEQ_USERS_ID</param>
            </generator>
        </id>

        <property name="loginName" column="LOGINNAME" type="java.lang.String" not-null="true">
            <meta attribute="use-in-tostring">true</meta>
        </property>

        <joined-subclass name="com.initech.SpecialUser" table="SPECIALUSERS">
            <key column="USERID"/>
        </joined-subclass>

    </class>
</hibernate-mapping>



  在应用程序级别上,我需要的是SpecialUsers表中包含的User对象的列表。


以下HQL查询将返回所有SpecialUser(也是User):

from SpecialUser


如果以后需要将列添加到SPECIALUSERS表中,则将相应的属性添加到SpecialUser类,并将它们映射到<joined-subclass>元素内。有关详细信息,请参阅提供的链接(至文档)。

09-15 15:22