【发布时间】:2010-02-24 15:16:03
【问题描述】:
我有一个用户表
CREATE TABLE "USERS" (
"ID" NUMBER NOT NULL ,
"LOGINNAME" VARCHAR2 (150) NOT NULL )
我还有第二张表 SpecialUsers。 SpecialUsers 表中的 UserId 不能出现两次,并且只有一小部分用户表中的用户 id 包含在 SpecialUsers 表中。
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 中映射用户表可以正常工作
<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 表中的用户对象列表。
【问题讨论】:
-
为什么不在 USERS 表中添加一个“特殊”字段?
-
我考虑过,但考虑到“特殊”用户很少(目前只有一个)和很多用户,这似乎不对。从长远来看,如果每个仅适用于一小部分用户的小属性都将直接添加到用户表中,这也会使用户表不清楚。更进一步的原因是,如果“特殊”用户将来应该有更多与他们的“特殊性”相关的属性,很容易扩展 SpecialUsers 表。
-
为什么你认为某处存在 0..n 关系?您的物理模型没有反映这一点,它代表了一个纯粹的父子层次结构(即继承)。我错过了什么吗?
-
@Pascal,如果您发现更好的描述,请随时更正标题。我猜逻辑是每个用户都有 0 到 1 个 SpecialUsers - 或者说,一些用户是特殊用户,但不是全部。
标签: java hibernate orm mapping one-to-one