2012-07-19 86 views
0

存在的数据我有三个表即personalinfo,groups_designation,groups_desig_category如何处理许多一对多的关系,在Hibernate

  • personalinfo:PID(个人ID)
  • groups_designation:GID(组ID )
  • groups_desig_category:GID,PID

其实我有两个表的数据(personalinfo,groups_designation)。所以我们有一个提供该screen.In,用户选择的组,然后分配个人ID和数据推送到groups_desig_category table.In这种情况下,我像映射

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> 

Personal.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; 
} 

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> 

DesignationGroupBean。 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)。但它没有工作。可能会改变一对多和多对一而不是多对多的关系。我认为它不适合这种情况。所以, ,在这种情况下如何处理?如果你使用反向工程,那么它创建为一对多和多对一的关系?为什么?请帮助我。

更新: -

我在一个一对多和多对一的一个很实现的关系数据库冬眠,而它的许多一对多relation.then它的做工精细,并粘贴以下休眠映射文件,一个一对多的关系舰

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

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

AssigGroupingDesig.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: -

Thanks.Removing逆标签及其工作fine.But我也不清楚哪些一代删除query.Please的检查日志

/* 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 (?, ?) 

为什么产生“从groups_desig_category删除其中pid =?”。PLZ帮我

更新3: -

Yes.Iam使用session.get.becuase我关于一些强制性fields.that的有例外加载数据的原因,我加载然后将数据更新记录

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

回答

1

在您的许多一对多映射,设置他们两人。您需要选择一个实体,它会自己的关系 - 对于那个,在映射中,您将删除inverse="true"设置。这将是保存或更新时将持续人与群体关系的实体。

因为在你的问题你贴saveOrUpdate(pBean),我认为pBeanPersonal实体,那么你需要删除Personal.hbm.xmlinverse="true"设置。

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

+0

感谢nicolae.Its工作fine.I有疑问,请在日的uDate公司2评论上述关于代“删除” query.Please帮我 – user1357722 2012-07-20 11:36:59

+1

@ user1357722请问当你正在更新一个现有的个人时删除?如果正在更新,请显示正在进行更新的代码块(例如,如果您正在获取个人通过加载(),则会显示该代码块,然后在此情况下更改PersistentSet的多对多集合,或者使用一个不是Hibernate返回的集合)。 – 2012-07-20 12:09:16

+0

再次感谢您。请检查更新3评论。 – user1357722 2012-07-20 14:17:57