Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在现有数据库上进行一对多单向休眠_Database_Hibernate_Mapping - Fatal编程技术网

Database 在现有数据库上进行一对多单向休眠

Database 在现有数据库上进行一对多单向休眠,database,hibernate,mapping,Database,Hibernate,Mapping,堆栈溢出专家您好,我需要您的专业知识: <list name="fieldData" cascade="all"> <key column="uid" not-null="true" /> <index column="parentuid" /> <one-to-many class="com.agetor.commons.fields.FieldData"/> </list> 我试图在现有数据库上使用Hibe

堆栈溢出专家您好,我需要您的专业知识:

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
我试图在现有数据库上使用Hibernate。 目前,我正在尝试加载一个用户对象和一组用户数据对象

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
在DB中(简化)布局为

|    User      |      |          UserData               |
----------------      -----------------------------------
uid | username |      | uid | parentuid | field | value | 
<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
因此,每个用户对象都匹配UserData.parentuid=User.uid的所有UserData对象

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
我的用户类映射文件

    <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> 
    <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>
<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>

Mu用户数据映射文件

    <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> 
    <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>
<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>

到目前为止,我已经尝试了许多不同的配置,所有配置都有不同程度的故障。粘贴在此处的代码无效

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
  • parentuid属性被注释掉,因为Hibernate在其他情况下会给出“映射中的重复列”错误
  • 目前,uid字段上仍然有一个“映射中的重复列”,我用于
  • 我不明白我在哪里指定UserData.parentuid是外键,而列表应该使用User.uid作为键
我希望有人能帮忙

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>

当您同时定义一对多和多对一时,这不是双向的吗? 当前的工作模型是单向的,UserData没有对用户的引用。您的建议失败了,因为Hibernate在UserData上找不到用户的get或set方法

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
这是否意味着,此代码使用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>
<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>

我仍在学习Hibernate,并通过我能找到的文档和示例进行工作。

试试这个(干代码):

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>

如果可行,尝试添加我遗漏的索引和级联内容

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
干杯,
米奇

试试这个(干码):

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>

如果可行,尝试添加我遗漏的索引和级联内容

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
干杯,

mitch

我认为您已经接近了,但列表可能不是您希望在新用户类中使用的数据结构。列表意味着子元素的排序,而表似乎没有。如果有一个索引集合(如列表),则数据必须有一个单独的列来提供索引,因此存在“映射中的重复列”问题

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
我使用的经验法则是——每个映射都应该为它映射的类的每个成员包含一个条目。因此,例如,您的用户类应该为其FieldData集合设置一个条目,但您的FieldData映射不需要parentuid的条目,因为该列不映射到FieldData类的元素-它只是用于将FieldData放入父对象集合中

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>

如果用户对象确实包含字段数据的有序集合,则使用集合。另一方面,我认为你更可能想要一个FieldData地图,使用“field”名称作为索引。那么FieldData类就不需要映射'field'列,也不需要将其作为成员,它只需要有值(以及此表中的任何其他字段-当然,如果真的只剩下一列要映射,您可能最终得到字符串到字符串的映射。

我想您已经接近了,但列表可能不是您希望在新用户类中使用的数据结构。列表意味着子元素的顺序,而表似乎没有。如果如果有一个像列表一样的索引集合,则数据必须有一个单独的列来提供索引,因此存在“映射中的重复列”问题

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
我使用的经验法则是——每个映射都应该为它映射的类的每个成员包含一个条目。例如,你的用户类应该为它的FieldData集合有一个条目,但是你的FieldData映射不需要parentuid条目,因为该列不映射到FieldData类的元素——它只是被使用将FieldData放入父对象的集合中

<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>

如果用户对象确实包含FieldData的有序集合,则使用集合。另一方面,我认为您更可能需要FieldData的映射,使用“field”名称作为索引。这样FieldData类就不需要映射“field”列,也不需要将其作为成员,它只需要具有值(以及此表中的任何其他字段-当然,如果真的只剩下一列要映射,您可能会得到字符串到字符串的映射。

这是此问题的最新发展。此配置可以成功地从数据库加载。保存不起作用。
<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>
我已经决定改变数据库设计,所以在我放弃这种方法之前,我在这里发布这篇文章供其他人参考

    <class name="com.agetor.commons.security.User" table="ac_users">
    <id name="uid" column="uid" type="long" >
        <generator class="increment"/>
    </id>
    <property name="deleted" column="deleted" />
    <property name="username" column="username" />   
    <property name="password" column="passwd" />
    <property name="disabled" column="disabled" />
    <property name="lockout" column="lockout" />
    <property name="expires" column="expires" />
    <bag name="fieldData" lazy="extra">
        <key column="parentuid" not-null="true" />
        <one-to-many class="com.agetor.commons.fields.FieldData"/>
    </bag>
    <bag name="groups" table="ac_group_rel" access="field" lazy="extra">
        <key column="useruid"/>         
        <many-to-many column="groupuid" class="com.agetor.commons.security.Group"/>
    </bag>         
    <join table="ac_userdef_data" optional="true" fetch="join">
        <subselect>
            select
                *
            from
                ac_userdef_data data
            where
                data.objectname = 'user' and
                data.fieldname = 'firstname'
        </subselect>
        <key column="parentuid" />
        <property name="firstname" formula="(select data.value from ac_userdef_data data where data.fieldname = 'firstname' and data.uid = uid)"/>
    </join>
    <join table="ac_userdef_data" optional="true" fetch="join">
        <subselect>
            select
                *
            from
                ac_userdef_data data
            where
                data.objectname = 'user' and
                data.fieldname = 'lastname'
        </subselect>        
        <key column="parentuid" />
        <property name="lastname" formula="(select data.value from ac_userdef_data data where data.fieldname = 'lastname' and data.uid = uid)"/>
    </join>

</class>
<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>

选择
*
从…起
ac_用户定义_数据
哪里
data.objectname='user'和
data.fieldname='firstname'
选择
*
从…起
ac_用户定义_数据
哪里
data.objectname='user'和
data.fieldname='lastname'

这是关于此问题的最新发展。此配置可以成功地从数据库加载。保存不起作用。 我已经决定改变数据库设计,所以在我放弃这种方法之前,我在这里发布这篇文章供其他人参考

    <class name="com.agetor.commons.security.User" table="ac_users">
    <id name="uid" column="uid" type="long" >
        <generator class="increment"/>
    </id>
    <property name="deleted" column="deleted" />
    <property name="username" column="username" />   
    <property name="password" column="passwd" />
    <property name="disabled" column="disabled" />
    <property name="lockout" column="lockout" />
    <property name="expires" column="expires" />
    <bag name="fieldData" lazy="extra">
        <key column="parentuid" not-null="true" />
        <one-to-many class="com.agetor.commons.fields.FieldData"/>
    </bag>
    <bag name="groups" table="ac_group_rel" access="field" lazy="extra">
        <key column="useruid"/>         
        <many-to-many column="groupuid" class="com.agetor.commons.security.Group"/>
    </bag>         
    <join table="ac_userdef_data" optional="true" fetch="join">
        <subselect>
            select
                *
            from
                ac_userdef_data data
            where
                data.objectname = 'user' and
                data.fieldname = 'firstname'
        </subselect>
        <key column="parentuid" />
        <property name="firstname" formula="(select data.value from ac_userdef_data data where data.fieldname = 'firstname' and data.uid = uid)"/>
    </join>
    <join table="ac_userdef_data" optional="true" fetch="join">
        <subselect>
            select
                *
            from
                ac_userdef_data data
            where
                data.objectname = 'user' and
                data.fieldname = 'lastname'
        </subselect>        
        <key column="parentuid" />
        <property name="lastname" formula="(select data.value from ac_userdef_data data where data.fieldname = 'lastname' and data.uid = uid)"/>
    </join>

</class>
<list name="fieldData" cascade="all">
    <key column="uid" not-null="true" />
    <index column="parentuid" />
    <one-to-many class="com.agetor.commons.fields.FieldData"/>
</list>