首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

,hiberate多对多关系的配置有关问题

2012-09-20 
求救,hiberate多对多关系的配置问题Resume表Rq表Id--简历编号Id-----编号Uid--用户编号rid---简历编号Dir-

求救,hiberate多对多关系的配置问题
Resume表 Rq表  
Id--简历编号 Id-----编号
Uid--用户编号 rid---简历编号
Dir---简历存放地址 rdir---简历存放地址
  qid----岗位编号

Quarter表
Id----岗位编号
cid----公司编号
name---岗位名称
require----能力要求
position----工作地点
sex----性别要求
experience----工作经验要求
education----学历
number----人数

Resume.hbm.xml 中多对多关系的配置代码部分
 <set name="quater" table="rq" cascade="all" inverse="true" lazy="true">
  <key>
  <column name="rid" not-null="true">
  <comment>????</comment>
  </column>
  </key>
  <many-to-many class="pojo.Quater" column="id">
  </many-to-many>
  </set>
Quater.hbm.xml 中多对多关系的配置代码部分
<set name="resume" table="rq" cascade="all" inverse="true" lazy="true">
  <key>
  <column name="qid" not-null="true">
  <comment>????</comment>
  </column>
  </key>
  <many-to-many class="pojo.Resume" column="id">
  </many-to-many>
  </set>
我在ResumeDao.java 对两个表进行关联的方法
public boolean resumeMail(Long rid,Long qid){
Transaction tx = session.beginTransaction();// 开始一个事务
try
{
Resume resume = (Resume)session.createQuery("from Resume r where r.id="+rid).uniqueResult();
Quater quater = (Quater)session.createQuery("from Quater q where q.id="+qid).uniqueResult();
resume.getQuater().add(quater);
quater.getResume().add(resume);
tx.commit();
return true;
}catch(Exception e){
e.printStackTrace();
tx.rollback();
return false;
}
}
结果运行没问题,可是rq表里面却一直没记录····不知道为什么····

[解决办法]
Hibernate 维护的对象与对象之间的关系, 为什么你的实体当中要将对象拆开,用字段引用?
Resume表
Id--简历编号 ---------- 这里应该用Quarter对象, 而具体的映射由配置文件决定,比如uid --> Quarter.id
Uid--用户编号
Dir---简历存放地址

Resume.hbm.xml 中多对多关系的配置代码部分 
<set name="quater" table="rq" cascade="all" inverse="true" lazy="true"> 
<key> 
<column name="rid" not-null="true"> 
<comment>???? </comment> 
</column> 
</key> 
<many-to-many class="pojo.Quater" column="id"> 
(在关系表中体现 rid 对 Quarter.id 的外键引用)
</many-to-many> 
</set> 
还有,多对多关系是需要中间表来维护的,如果是双向多对多关系的话, Hibernate 需要手工指定双方是由同一个中间表维护,不然会出现两个毫无干系的多对一关系
[解决办法]
Resume resume = (Resume)session.createQuery("from Resume r where r.id="+rid).uniqueResult(); 
Quater quater = (Quater)session.createQuery("from Quater q where q.id="+qid).uniqueResult(); 
resume.getQuater().add(quater); 
quater.getResume().add(resume); 
还有你这样操作后?resume,quater均变为临时对象,并没有持久化的过程,怎么能保存到数据库呢?
你的resume,和quarter是怎么联系的,表结构上没有体现嘛,映射文件也没写对。



[解决办法]
Resume.hbm.xml 应该改为: 
<set name="quater" table="rq" cascade="all" inverse="true" lazy="true"> 
<key> 
<column name="rid" not-null="true"> 
<comment>???? </comment> 
</column> 
</key> 
<many-to-many class="pojo.Rq" column="id"> 
</many-to-many> 
</set> 

Quater.hbm.xml应为
<set name="resume" table="rq" cascade="all" inverse="true" lazy="true"> 
<key> 
<column name="qid" not-null="true"> 
<comment>???? </comment> 
</column> 
</key> 
<many-to-many class="pojo.Rq" column="id"> 
</many-to-many> 
</set> 
即,rq表均关联到Quater和Resume表中,多对多
[解决办法]
Hibernate在用户量多的项目里面最好少用关联。即使关联也要尽量将查询的数据量降到最低。
[解决办法]
http://www.blogjava.net/zoninge/archive/2009/01/12/250972.html
参考这个 多对多实例
[解决办法]
配置一对多,多对一,一对一,多对多关系的时候比较容易出错,一定要看清楚那边是一,那边是多,还有级联删除等属性,有点麻烦,需要细心点。定一下!
[解决办法]
你两方都设置了inverse="true"。这个标签的意思是把维护关系交给对方。所谓维护关系就是对中间表的操作。去掉其中一个试试。
[解决办法]
除了楼上所说的inverse这个错之外,还有<many-to-many class="pojo.Quater" column="id"> </many-to-many> 这个column应该为中间表的外键

[解决办法]
/** 
*@author QQde00 
*@date 2009-12-02 
*/

多对多关系在hibernate中配置的例子:

有两个类:
1.Admin:管理员
2.Role:管理员的角色,,可能为财务管理员、产品管理员、订单管理员等。
Admin与Role之间的关系为多对多关系,即一个管理员可能同时为财务管理员、产品管理员,而一个角色有可能被多个管理员扮演,如产品管理员可能有a管理员、b管理员等。

对应的为这两个类设计两个表:
1.t_admin(管理员表): id, name, password, realName, enrollDate
2.t_role(角色表): id, name, code
3.t_admin_rold(管理员与角色关系表): admin_id, role_id

两个类的源代码如下,类中体现为双向的多对多关系:
//Admin.java
import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

public class Admin implements Serializable {
private Integer id ;
private String loginName ;
private String realName ;
private String password ;
private Date enrollDate ;
private Set<Role> roles = new HashSet<Role>();

//给Admin添加一个Role,并注册双边关系
public void addRole( Role r ){
roles.add( r ) ;
r.getAdmins().add( this ) ;
}

//从Admin中删除一个Role,并删除双边关系
public void removeRole( Role r ){
roles.remove( r ) ;
r.getAdmins().remove( this ) ;
}

//删除一个Admin中所有Role,并删除双边关系
public void clearRole( ){
for( Role r : roles ){
r.getAdmins().remove( this ) ;
}
roles.clear();
}

public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLoginName() {


return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getEnrollDate() {
return enrollDate;
}
public void setEnrollDate(Date enrollDate) {
this.enrollDate = enrollDate;
}

}

//Role.java
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Role implements Serializable {
private Integer id ;
private String name ;
private String code ;
private Set<Admin> admins = new HashSet<Admin>();

public Set<Admin> getAdmins() {
return admins;
}
public void setAdmins(Set<Admin> admins) {
this.admins = admins;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}

*.hbm.xml中的配置:
<class name="Admin" table="t_admin">
<id name="id">
<generator class="increment"/>
</id>
<property name="loginName" column="login_name" type="string"/>
<property name="realName" column="real_name" type="string"/>
<property name="password" column="passwd" type="string"/>
<property name="enrollDate" column="enroll_date" type="date"/>
<set name="roles" inverse="true" table="t_admin_role" cascade="save-update">
<!— table="t_admin_role"是指我们是多对多的关系,由t_admin_role这个表确定我们之间的关系。 -->
<key column="admin_id"/><!-- 在关系表中admin_id这个外键是根据本类对应表中的主键生成的 -->
<many-to-many class="Role" column="role_id"/><!—与本类有多对多的类型Role,而且它在关系表中的外键是role_id -->
</set>
</class>


<class name="Role" table="t_role">
<id name="id">
<generator class="increment"/>
</id>
<property name="name" type="string"/>
<property name="code" type="string"/>
<set name="admins" table="t_admin_role" cascade="save-update"><!-- table="t_admin_role"是指我们是多对多的关系,由t_admin_role这个表确定本类与关系属性之间的关系。 -->
<key column="role_id"/><!-- 在关系表中role_id这个外键是根据本类的主键生成的 -->
<many-to-many class="Admin" column="admin_id"/><!-- 跟本类多对多的类型Admin,而且它在关系表中的外键是admin_id -->
</set>
</class>

热点排行