Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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
Java Hibernate中如何处理与已有数据的多对多关系_Java_Hibernate_Many To Many_Hibernate Mapping - Fatal编程技术网

Java Hibernate中如何处理与已有数据的多对多关系

Java Hibernate中如何处理与已有数据的多对多关系,java,hibernate,many-to-many,hibernate-mapping,Java,Hibernate,Many To Many,Hibernate Mapping,我有三个表格,即个人信息、团体名称、团体设计类别 个人信息:pid(个人id) 组名称:gid(组id) 组设计类别:gid、pid 实际上,我在两个表中都有数据(personalinfo,groups\u designation)。因此,我们提供了一个屏幕。在这个屏幕中,用户选择组并分配个人id,数据被拉到groups\u design\u类别表中。在这个场景中,我映射如下 Personal.hbm.xml:- <set name="empwthgrp" inverse="true

我有三个表格,即个人信息、团体名称、团体设计类别

  • 个人信息:pid(个人id)
  • 组名称:gid(组id)
  • 组设计类别:gid、pid
实际上,我在两个表中都有数据(personalinfo,groups\u designation)。因此,我们提供了一个屏幕。在这个屏幕中,用户选择组并分配个人id,数据被拉到groups\u design\u类别表中。在这个场景中,我映射如下

Personal.hbm.xml:-

<set name="empwthgrp" inverse="true" lazy="true"  table="groups_desig_category">
 <key>
    <column name="pid" not-null="true" />
  </key>

            <many-to-many entity-name="com.aims.beans.DesignationGroupBean">
                <column name="gid" not-null="true" />
            </many-to-many>

</set>
GroupingDesig.hbm.xml:-

<class name="beans.DesignationGroupBean" table="groups_designation" proxy=beans.DesignationGroupBean">

<id name="gid" column="gid" type="java.lang.Integer">
 <generator class="sequence"><param name="sequence">gid_seq</param> </generator>
</id>
<property name="gname"  type="java.lang.String" column="gname" not-null="true" />
<property name="description"  type="java.lang.String" column="description" not-null="true" />
<set name="grpwthemp" inverse="true" lazy="true" table="groups_desig_category">
 <key>
    <column name="gid" not-null="true" />
  </key>
             <many-to-many entity-name="com.aims.beans.Personal">
                <column name="pid" not-null="true" />
            </many-to-many>
</set>
</class>
<set name="grpwthemp" inverse="true" lazy="true" table="groups_desig_category">
 <key>
    <column name="gid" not-null="true" />
  </key>
                <one-to-many class="com.aims.beans.GroupAssignment"/>


           <!--  <many-to-many entity-name="com.aims.beans.Personal">
                <column name="pid" not-null="true" />
            </many-to-many>-->

</set>
<many-to-one name="personal" column="pid" class="com.aims.beans.Personal" not-null="true"></many-to-one>
<many-to-one name="desigdt" column="gid" class="com.aims.beans.DesignationGroupBean" not-null="true"></many-to-one>
实际上,我正在尝试session.saveOrUpdate(pBean)。但它不起作用。可能是可以更改一对多和多对一而不是多对多关系。我认为它不适合这种情况。那么,在这种情况下如何处理?如果使用反向工程,那么它将创建为一对多和多对一关系?为什么?请帮帮我

更新:-

我是在一对多和多对一关系的hibernate中实现的,而在数据库中是多对多关系的。然后它工作正常,下面用一对多关系粘贴hibernate映射文件

GroupingDesig.hbm.xml:-

<class name="beans.DesignationGroupBean" table="groups_designation" proxy=beans.DesignationGroupBean">

<id name="gid" column="gid" type="java.lang.Integer">
 <generator class="sequence"><param name="sequence">gid_seq</param> </generator>
</id>
<property name="gname"  type="java.lang.String" column="gname" not-null="true" />
<property name="description"  type="java.lang.String" column="description" not-null="true" />
<set name="grpwthemp" inverse="true" lazy="true" table="groups_desig_category">
 <key>
    <column name="gid" not-null="true" />
  </key>
             <many-to-many entity-name="com.aims.beans.Personal">
                <column name="pid" not-null="true" />
            </many-to-many>
</set>
</class>
<set name="grpwthemp" inverse="true" lazy="true" table="groups_desig_category">
 <key>
    <column name="gid" not-null="true" />
  </key>
                <one-to-many class="com.aims.beans.GroupAssignment"/>


           <!--  <many-to-many entity-name="com.aims.beans.Personal">
                <column name="pid" not-null="true" />
            </many-to-many>-->

</set>
<many-to-one name="personal" column="pid" class="com.aims.beans.Personal" not-null="true"></many-to-one>
<many-to-one name="desigdt" column="gid" class="com.aims.beans.DesignationGroupBean" not-null="true"></many-to-one>
为什么要生成“从组中删除设计类别,其中pid=?”。请帮助我

更新3:-

是的。我正在使用session.get加载数据。因为我遇到了一些必填字段的异常。这就是我加载数据然后更新记录的原因

          per=(Personal)session.get(Personal.class,new Integer(pBean.getPid()));
    per.setEmpwthgrp(pBean.getEmpwthgrp());
    session.saveOrUpdate(per);

在多对多映射中,将它们的都设置为逆。您需要选择一个将拥有该关系的实体-对于该实体,在映射中,您将删除
inverse=“true”
设置。该实体在保存或更新时将保持人与组的关系

因为在您的问题中,您发布了
saveOrUpdate(pBean)
,并且我假设
pBean
Personal
实体,那么您需要删除
Personal.hbm.xml
中的
reverse=“true”
设置


参考文档中的更多信息:

谢谢nicolae。它工作正常。我有疑问,请查看上面关于生成“删除”查询的udate 2评论。请帮助me@user1357722当您更新现有个人信息时,是否会发生删除?如果正在更新,请显示正在执行更新的代码块(例如,这将显示您是否正在获取Personal throught load(),然后更改多对多集合(在本例中为PersistentSet),或者使用非Hibernate返回的集合)。@user1357722由于删除问题,那么insert与这个问题无关,我更希望你能提出另一个问题。这样,任何其他可能遇到相同问题的人都会发现解决方案更容易。创建一个新问题,在这里发布链接,我(和其他人)将尝试回答。
          per=(Personal)session.get(Personal.class,new Integer(pBean.getPid()));
    per.setEmpwthgrp(pBean.getEmpwthgrp());
    session.saveOrUpdate(per);