代码之家  ›  专栏  ›  技术社区  ›  user1357722

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

  •  0
  • user1357722  · 技术社区  · 13 年前

    我有三张表,即personalinfo、groups_designation、groups_desing_category

    • 个性化信息:pid(个人id)
    • groups_designation:gid(组id)
    • groups_desing_category:gid,pid组

    事实上,我在两个表中都有数据(personalinfo,groups_designation)。所以我们提供了一个屏幕。在这个屏幕中,用户选择组并分配个人id和拉入groups_desing_category表的数据。在这个场景中,我像

    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>
    

    个人.java:-

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int pid,deptno;
    private String name,designation;
    private Address address;
    private Address permentaddress;
    private Set famildtlslst;
    private Set empwthgrp=new HashSet();
    public Set getEmpwthgrp() {
        return empwthgrp;
    }
    public void setEmpwthgrp(Set empwthgrp) {
        this.empwthgrp = empwthgrp;
    }
    public Set getFamildtlslst() {
        return famildtlslst;
    }
    public void setFamildtlslst(Set famildtlslst) {
        this.famildtlslst = famildtlslst;
    }
    public Address getPermentaddress() {
    
        return permentaddress;
    }
    public void setPermentaddress(Address permentaddress) {
    
        this.permentaddress = permentaddress;
    }
    public Address getAddress() {
    
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public int getDeptno() {
        return deptno;
    }
    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPid() {
        return pid;
    }
    public void setPid(int pid) {
        this.pid = pid;
    }
    public String getDesignation() {
        return designation;
    }
    public void setDesignation(String designation) {
        this.designation = designation;
    }
    

    分组设计.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>
    

    设计组Bean.java:-

    private int gid;
    private String gname,description;
    private Set grpwthemp=new HashSet();
    public Set getGrpwthemp() {
        return grpwthemp;
    }
    public void setGrpwthemp(Set grpwthemp) {
        this.grpwthemp = grpwthemp;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public int getGid() {
        return gid;
    }
    public void setGid(int gid) {
        this.gid = gid;
    }
    public String getGname() {
        return gname;
    }
    public void setGname(String gname) {
        this.gname = gname;
    }
    

    实际上我尝试了session.saveOrUpdate(pBean)。但它不起作用。可能是可以更改一对多和多对一,而不是多对多关系。我认为它不适合这种情况。那么,如何在这种情况下处理?。如果你使用逆向工程,那么它创建了一对多和多对一的关系?为什么?请帮帮我。

    更新:-

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

    分组设计.hbm.xml:-

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

    个人.hbm.xml

    <set name="empwthgrp" inverse="true" lazy="true"  table="groups_desig_category">
     <key>
        <column name="pid" not-null="true" />
      </key>
        <one-to-many class="com.aims.beans.GroupAssignment"/>
    
                <!--
                <many-to-many entity-name="com.aims.beans.DesignationGroupBean">
                    <column name="gid" not-null="true" />
                </many-to-many>-->
    
    </set>
    

    协助分组设计.hbm.xml:-

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

    什么时候会来图片关系船?。我在网上搜索了很多关系示例,即,。

    Mykong many-to-many

    请帮帮我。 我的问题是什么时候会实时出现/使用多对多关系?。

    更新2:-

    谢谢。删除反向标记工作正常。但我对删除查询的生成有疑问。请检查日志

     /* load com.beans.Personal */ select personal0_.pid as pid0_, personal0_.name as name5_0_, personal0_.DEPTNO as DEPTNO5_0_, personal0_.designation as designat4_5_0_, personal0_.pddress1 as pddress5_5_0_, personal0_.pddress2 as pddress6_5_0_, personal0_.pcity as pcity5_0_, personal0_.pstate as pstate5_0_, personal0_1_.HomeAddress1 as HomeAddr2_7_0_, personal0_1_.HomeAddress2 as HomeAddr3_7_0_, personal0_1_.homecity as homecity7_0_, personal0_1_.homestate as homestate7_0_ from personalinfo personal0_, address personal0_1_ where personal0_.pid=personal0_1_.pid and personal0_.pid=?
    
    
    
    delete collection com.beans.Personal.empwthgrp */ delete from groups_desig_category where pid=?
    
    
    
    
    insert collection row com.beans.Personal.empwthgrp */ insert into groups_desig_category (pid, gid) values (?, ?)
    

    为什么生成“delete from groups_desig_category where pid=?”。Plz帮助我

    更新3:-

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

              per=(Personal)session.get(Personal.class,new Integer(pBean.getPid()));
        per.setEmpwthgrp(pBean.getEmpwthgrp());
        session.saveOrUpdate(per);
    
    1 回复  |  直到 13 年前
        1
  •  1
  •   Nicolae Albu    13 年前

    在多对多映射中 二者都 他们中的 相反的 。您需要选择一个实体 拥有 关系-对于该关系,在映射中,您将删除 inverse="true" 背景这将是一个实体,当保存或更新时,它将保持人与组的关系。

    因为在你的问题中你发布了 saveOrUpdate(pBean) ,我想 pBean Personal 实体,则需要删除 inverse=“真” 设置 Personal.hbm.xml

    参考文档中的更多信息: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/associations.html#assoc-bidirectional-join-m2m