复合主键中的外键(重复列错误)

时间:2015-02-06 16:51:11

标签: java xml database hibernate hbm

我们只是将Hibernate集成到我们的Web应用程序中,该应用程序从今天开始使用直接查询到关系数据库。 我们生成了hbm.xml文件,以便通过hibernate实现访问数据库的所有实体和映射,以便进行读写。

问题是我们的架构有许多复合主键,因此,我们有很多外键引用那些复合键。

上面你可以看到我们遇到很多问题的数据库模式的例子。还有hbm.xml文件:

<class name="Profile" table="Profile" optimistic-lock="version">
    <id name="profileId" type "java.lang.Integer">
        <column name="profileId" />
        <generator class="assigned" />
    </id>
    <many-to-one name="location" class="Location" fetch="select" >
        <column name="locationId" length="3" not-null="true" />
    </many-to-one>
    <many-to-one name="users" class="Users" fetch="select"> 
          <column name="locationId" length="3" not-null="true" /> 
          <column name="userId" length="30" not-null="true" />
    </many-to-one>
     <many-to-one name="groupUsers" class="GroupUsers" fetch="select"> 
          <column name="locationId" length="3" not-null="true" /> 
          <column name="groupUserId" length="30" not-null="true" />
    </many-to-one>
</class>

<class name="Users" table="Users" optimistic-lock="version">
    <composite-id name="id" class="UsersId">
        <key-property name="locationId" type="string">
            <column name="locationId" length="3" />
        </key-property>
        <key-property name="userId" type="string">
            <column name="userId" length="30" />
        </key-property>
    </composite-id>

    <set name="profiles" table="Profile" inverse="true" lazy="true" fetch="select">
        <key>
            <column name="locationId" length="3" not-null="true" />
            <column name="userId" length="30" not-null="true" />
        </key>
        <one-to-many class="Profile" />
    </set>
</class>

<class name="GroupUsers" table="GroupUsers" optimistic-lock="version">
    <composite-id name="id" class="GroupUsersId">
        <key-property name="locationId" type="string">
            <column name="locationId" length="3" />
        </key-property>
        <key-property name="groupUserId" type="string">
            <column name="groupUserId" length="30" />
        </key-property>
    </composite-id>

    <set name="profiles" table="Profile" inverse="true" lazy="true" fetch="select">
        <key>
            <column name="locationId" length="3" not-null="true" />
            <column name="groupUserId" length="30" not-null="true" />
        </key>
        <one-to-many class="Profile" />
    </set>
</class>

<class name="Location" table="Location" optimistic-lock="version">
    <id name="locationId" type="string">
        <column name="locationId" length="3" />
        <generator class="assigned" />
    </id>

    <set name="profiles" table="Profile" inverse="true" lazy="true" fetch="select">
        <key>
            <column name="locationId" length="3" not-null="true" />
        </key>
        <one-to-many class="Profile" />
    </set>
</class>

启动Tomcat时出现以下错误:“配置文件列:locationId(应使用insert =”false“update =”false“映射)”

但是如果我尝试将这两个属性放在Profile.hbm.xml文件的多对一关系中,我就无法将配置文件实例插入数据库(没有效果):

<many-to-one name="location" class="Location" fetch="select" insert="false" update="false">
      <column name="locationId" length="3" not-null="true" />
</many-to-one>
 <many-to-one name="users" class="Users" fetch="select"insert="false" update="false"> 
      <column name="locationId" length="3" not-null="true" /> 
      <column name="userId" length="30" not-null="true" />
</many-to-one>
 <many-to-one name="groupUsers" class="GroupUsers" fetch="select" insert="false" update="false"> 
      <column name="locationId" length="3" not-null="true" /> 
      <column name="groupUserId" length="30" not-null="true" />
</many-to-one>

有人可以帮助我吗?

非常感谢你。

1 个答案:

答案 0 :(得分:0)

因为您说现有架构中有许多复合主键,其中包含数据,并且您希望向其添加休眠。 听起来你而不是没有复合主键。

只是一个想法: 我认为放弃现有的组合主键,使它们成为 uniqe indices 并创建新的非组合主键来更新所有数据并不是一件大事。序列(取决于您使用的DMBS)。

这当然取决于你想如何整合hibernate。可能有理由保留旧的组合主键。 但也许你应该考虑一下。