您好 Stack Overflow 专家,我需要您的专业知识:
我正在尝试在现有数据库上使用 Hibernate。目前我正在尝试加载一个用户对象和一个用户数据对象列表。
在数据库中(简化的)布局是
| User | | UserData |
---------------- -----------------------------------
uid | username | | uid | parentuid | field | value |
因此,每个 User 对象都匹配 UserData.parentuid = User.uid 的所有 UserData 对象。
我的用户类映射文件
<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 UserData 映射文件
<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 上找不到用户的 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,并通过我能找到的文档和示例进行工作。