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
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);