你好 Stack Overflow 专家,我需要你的专业知识:
我正在尝试在现有数据库上使用 Hibernate。 目前我正在尝试加载一个 User 对象和一个 UserData 对象列表。
在数据库中,(简化的)布局是
| User | | UserData |
---------------- -----------------------------------
uid | username | | uid | parentuid | field | value |
因此每个 User 对象匹配所有 UserData 对象,其中 UserData.parentuid = User.uid。
我的用户类映射文件
<class name="com.agetor.commons.security.User" table="ac_users">
<id name="uid" column="uid" type="long" >
<!--<generator class="native"/>-->
</id>
<property name="username" column="username" />
<list name="fieldData" cascade="all">
<key column="parentuid" not-null="true" />
<index column="parentuid" />
<one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
</class>
Mu 用户数据映射文件
<class name="com.agetor.commons.fields.FieldData" table="ac_userdef_data">
<id name="uid" column="uid" type="long" >
<!--<generator class="native"/> -->
</id>
<!--<property name="parentuid" column="parentuid" /> -->
<property name="fieldname" column="fieldname" />
<property name="value" column="value" />
</class>
到目前为止,我已经尝试了许多不同的配置,但所有配置都出现了不同程度的失败。粘贴在这里的代码不起作用。
- parentuid 属性被注释掉,否则 Hibernate 会给出“映射中的重复列”错误。
- 目前在 uid 字段上仍然有一个“映射中的重复列”,我用于
<list-index />
- 我不明白我在哪里指定 UserData.parentuid 是外键并且列表应该使用 User.uid 作为键。
我希望有人能够提供帮助。
当您同时定义一对多和多对一时,这不是双向的吗? 当前的工作模型是单向的,UserData 没有对 User 的引用。您的建议失败了,因为 Hibernate 无法在 UserData 上找到 User 的 get 或 set 方法。
是否暗示此代码使用 User.uid 作为键并将其与 UserData.parentuid 列匹配?还是在其他地方指定了这个事实?
<list name="fieldData" inverse="true">
<key column="parentuid" not-null="true" />
<one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
我仍在学习 Hibernate 并通过我能找到的文档和示例按照自己的方式工作。
最佳答案
试试这个(干代码):
<class name="com.agetor.commons.security.User" table="ac_users">
<id name="uid" column="uid" type="long" >
<!--<generator class="native"/>-->
</id>
<property name="username" column="username" />
<list name="fieldData" inverse="true">
<key column="parentuid" not-null="true" />
<one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
</class>
<class name="com.agetor.commons.fields.FieldData" table="ac_userdef_data">
<id name="uid" column="uid" type="long" >
<!--<generator class="native"/> -->
</id>
<many-to-one name="user" class="com.agetor.commons.security.User" fetch="join">
<column name="parentuid" not-null="true"/>
</many-to-one>
<property name="fieldname" column="fieldname" />
<property name="value" column="value" />
</class>
如果可行,请尝试添加我遗漏的索引和级联内容。
干杯,
米奇
关于database - 在现有数据库上 hibernate 一对多单向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/507358/