database - 在现有数据库上 hibernate 一对多单向

标签 database hibernate mapping

你好 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/

相关文章:

database - 如何序列化矢量时钟,以便可以按字典顺序对时钟进行排序

c++ - 通过 libpqxx 将数据插入 PostgreSQL 时出现问题

JQuery 在单击和/或悬停在 <area> 上时更改 <map> 图像源 - 我做错了什么?

r - 使用 PBSMapping 和 Shapefiles 帮助在 R 中绘制地理数据

sql-server - 这是 "correct"数据库设计吗?

mysql - sql如何设置新列的默认值 bool 值?

hibernate - Spring boot CrudRepo Save() 方法不会合并现有条目,但会替换

java - 防止 Spring 应用程序中 Hibernate Search 的初始化

java - 使用 not in with join 和 between with HQL

java - 将 SQLquery 映射到普通对象,而不是实体