我们只是将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>
有人可以帮助我吗?
非常感谢你。
答案 0 :(得分:0)
因为您说现有架构中有许多复合主键,其中包含数据,并且您希望向其添加休眠。 听起来你而不是没有复合主键。
只是一个想法: 我认为放弃现有的组合主键,使它们成为 uniqe indices 并创建新的非组合主键来更新所有数据并不是一件大事。序列(取决于您使用的DMBS)。
这当然取决于你想如何整合hibernate。可能有理由保留旧的组合主键。 但也许你应该考虑一下。