谈谈Hibernate中一对多

一、准备工作:Member.java

package com.fhqiu.hibernate.beans.member;

import java.util.HashSet;
import java.util.Set;

public class Member {
 /**
  * 记录会员的具体信息
  */
 private long id;
 private String username;
 private String email;
 private String password;
 private String realName;
 private String sex;
 private String address;
 private String mail;
 private String cellphone;
 private String companyPhone;
 private String homePhone;
 private Set<Comment> comments=new HashSet<Comment>();
 
 
 /**
  * 默认的无参构造函数
  */
 public Member() {
  super();
  // TODO Auto-generated constructor stub
 }
 /**
  * 与业务无关的ID
  * @return
  */
 public long getId() {
  return id;
 }
 /**
  * 业务无关ID
  * @param id
  */
 public void setId(long id) {
  this.id = id;
 }
 
 
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 /**
  * 得到会员的邮编
  * @return 返回会员的邮编
  */
 public String getEmail() {
  return email;
 }
 /**
  * 设置会员的邮编
  * @param email 传入的会员邮编
  */
 public void setEmail(String email) {
  this.email = email;
 }
 /**
  * 得到会员密码
  * @return 返回会员的密码
  */
 public String getPassword() {
  return password;
 }
 /**
  * 设定用户的密码
  * @param password 设置的会员密码
  */
 public void setPassword(String password) {
  this.password = password;
 }
 /**
  * 得到会员的真实姓名
  * @return 返回会员的真实姓名
  */
 public String getRealName() {
  return realName;
 }
 /**
  * 设定会员的真实姓名
  * @param realName 会员的真实姓名
  */
 public void setRealName(String realName) {
  this.realName = realName;
 }
 
 /**
  * 性别
  * @return
  */
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 /**
  * 得到会员的详细地址
  * @return 返回会员的详细地址
  */
 public String getAddress() {
  return address;
 }
 /**
  * 设定会员的详细地址
  * @param address 会员的详细地址
  */
 public void setAddress(String address) {
  this.address = address;
 }
 /**
  * 得到用户的邮编
  * @return 返回会员的邮编
  */
 public String getMail() {
  return mail;
 }
 /**
  * 设定会员的邮编
  * @param mail 会员邮编
  */
 public void setMail(String mail) {
  this.mail = mail;
 }
 /**
  * 得到会员的手机号码
  * @return 返回会员的手机号码
  */
 public String getCellphone() {
  return cellphone;
 }
 /**
  * 设定会员的手机号码
  * @param cellphone 会员手机号码
  */
 public void setCellphone(String cellphone) {
  this.cellphone = cellphone;
 }

 /**
  * 会员公司电话
  * @return 返回会员的公司电话
  */
 public String getCompanyPhone() {
  return companyPhone;
 }
 /**
  * 设定公司电话号码
  * @param companyPhone
  */
 public void setCompanyPhone(String companyPhone) {
  this.companyPhone = companyPhone;
 }
 /**
  * 会员的家庭电话
  * @return 返回会员的家庭电话
  */
 public String getHomePhone() {
  return homePhone;
 }
 /**
  * 设定会员的家庭电话
  * @param homePhone 家庭电话
  */
 public void setHomePhone(String homePhone) {
  this.homePhone = homePhone;
 }
 
 
 
 /**
  * 会员发布的评论
  * @return 返回会员的评论
  */
 public Set<Comment> getComments() {
  return comments;
 }
 
 /**
  * 设置会员的评论
  * @param comments 评论
  */
 public void setComments(Set<Comment> comments) {
  this.comments = comments;
 }
  
 
}

Comment.java

package com.fhqiu.hibernate.beans.member;

import java.util.Date;

public class Comment {
 /**
  * 记录会员的评论
  */
 private long id;
 private String text;
 private Date commentDate;
 private Member member;
 
 
 /**
  * 默认的无参构造函数
  */
 public Comment() {
  super();
  // TODO Auto-generated constructor stub
 }
 /**
  * 与业务无关的ID
  * @return
  */
 public long getId() {
  return id;
 }
 /**
  * 业务无关ID
  * @param id
  */
 public void setId(long id) {
  this.id = id;
 }
 /**
  * 会员的评论
  * @return 返回评论
  */
 public String getText() {
  return text;
 }
 /**
  * 设定会员的评论
  * @param text 评论
  */
 public void setText(String text) {
  this.text = text;
 }
 
 /**
  * 评论的会员
  * @return 返回评论的会员
  */
 public Member getMember() {
  return member;
 }
 
 /**
  * 评论日期
  * @return 返回评论日期
  */
 public Date getCommentDate() {
  return commentDate;
 }
 
 /**
  * 设定评论日期
  * @param date 评论日期
  */
 public void setCommentDate(Date commentDate) {
  this.commentDate = commentDate;
 }
 /**
  * 设定评论的会员
  * @param member 会员
  */
 public void setMember(Member member) {
  this.member = member;
 }
 
 
}
Member.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.fhqiu.hibernate.beans.member">
 <class name="Member">
  <id name="id">
   <generator class="identity"/>
  </id>
  <property name="username" type="string" not-null="true"/>
  <property name="password" type="string" not-null="true"/>
  <property name="email" type="string"/>
  <property name="realName" type="string"/>
  <property name="sex" type="string"/>
  <property name="address" type="string"/>
  <property name="mail" type="string"/>
  <property name="cellphone" type="string"/>
  <property name="companyPhone" type="string"/>
  <property name="homePhone" type="string"/>
  
  
  
  <set name="comments" cascade="all">
   <key column="member_id"/>
   <one-to-many class="Comment" />
  </set>

  
  
 </class>
</hibernate-mapping>

二、             项目中一对多的深入了解:(从多端对数据的操作)

Member.hbm.xml中的代码)

 

  <set name="comments" cascade="all" inverse="true">

    <key column="member_id"/>

    <one-to-many class="Comment" />

</set>

在多的一端member(会员)设置cascade="all",做到当会员不存在时,其他根会员相关联的信息也要随之删除,即必须有delete级联。当会员相关发生改变时,即save-update时,要用该级联。根据上面的情况设置为cascade="all"。使用inverse=true”时要特别注意,要在多的一方进行保存,不然多一端的表中的外銉关联为null;

 

1.在多的一端保存数据的代码:

//首选取出要关联的会员对象

              Query query=session.createQuery("from Member where username='fhqiu'");

       List list=query.list();

      

       Iterator iterator=list.iterator();

       while(iterator.hasNext()){

           member=(Member)iterator.next();

       }

       Comment comment=new Comment();

       comment.setCommentDate(new Date());

       comment.setText("我来测试");

//设置关联的会员对象

       comment.setMember(member);

     session.save(comment);

必须特别注意的是:member必须存在,不然会出现异常。

 

 

2.在多的一端删除数据的代码:

       Comment comment=new Comment();

       Query query=session.createQuery("from Comment");

       List list=query.list();

       Iterator iterator=list.iterator();

       while(iterator.hasNext()){

           comment=(Comment)iterator.next();

           session.delete(comment);

     }

注:删除多端的记录,并不要管关联一端的联系,只要找到多一端想要删除的记录,并用session.delete(comment);就行。

 

3.在多的一端更新数据的代码:

       Comment comment=new Comment();

       Query query=session.createQuery("from Comment");

       List list=query.list();

       Iterator iterator=list.iterator();

       while(iterator.hasNext()){

       comment=(Comment)iterator.next();

      

    }

       comment.setText("更新成功了没");

     session.update(comment);

注:同样更新多端记录与一端没有关联,只要找到相关的对象就行。

 

一对多关联的多端数据操作总结:

由上所述可以知道:在多端的数据作操,仅在数据保存时与一端有关联,其他相关操作都与一端无关联

二、             项目中一对多的深入了解:(从一端对数据的操作)

 

在对一端操作时,必须申明的一点时,请将inverse=”false”,当然系统默认是false,学者必须注意不要设置成true,如果设置为true造成的后果是多一端的外键会为NULL.

       这里虽然谈到了从一端去保存多的一端,但本人并不建议学者,在实际操作时从一端去保存多端的数据

(1). 一对多端一端的保存,仅对自身属性的保存

 

       Member member =new Member();

       member.setAddress("湖南岳阳");

       member.setCellphone("13647466580");

       member.setCompanyPhone("07307986069");

       member.setEmail("fhq2006@126.com");

       member.setHomePhone("07307986069");

       member.setMail("414100");

       member.setPassword("136136");

       member.setUsername("fhqiu");

       member.setSex("");

       member.setRealName("赵洋");

     session.save(member);

这是最基本的保存,也是用的最多的,因为一般,多端的数据往往是不断变化的,所以在一开始只是加入自身属性。

 

2)一对多端一端的保存,对自身和多端数据的保存(没有级联的保存)

       Comment comment1=new Comment();

       comment1.setCommentDate(new Date());

       comment1.setText("我来测试1");

       session.save(comment1);

      

       Comment comment2=new Comment();

       comment2.setCommentDate(new Date());

       comment2.setText("我来测试2");

       session.save(comment2);

      

       Set<Comment> comments=new HashSet<Comment>();

       comments.add(comment1);

       comments.add(comment2);

      

      

       Member member =new Member();

       member.setAddress("湖南岳阳");

       member.setCellphone("13647466580");

       member.setCompanyPhone("07307986069");

       member.setEmail("fhq2006@126.com");

       member.setHomePhone("07307986069");

       member.setMail("414100");

       member.setPassword("136136");

       member.setUsername("fhqiu");

       member.setSex("");

       member.setRealName("赵洋");

       member.setComments(comments);

     session.save(member);

注:在一端保存多端数据时,如果没有设置级联,多端数据必须在session.save(member);之前session.save(comment2);来保存自己,不然多端的外键将为NULL.

 

3)一对多端一端的保存,对自身和多端数据的保存(有级联的保存)

    首先必须配置cascade="all"为级联设置,前面已经讲了不多重复

后面的有级联时都必须,后面不再找到

       Comment comment1=new Comment();

       comment1.setCommentDate(new Date());

       comment1.setText("我来测试1");

       //session.save(comment1);

      

       Comment comment2=new Comment();

       comment2.setCommentDate(new Date());

       comment2.setText("我来测试2");

       //session.save(comment2);

      

       Set<Comment> comments=new HashSet<Comment>();

       comments.add(comment1);

       comments.add(comment2);

      

      

       Member member =new Member();

       member.setAddress("湖南岳阳");

       member.setCellphone("13647466580");

       member.setCompanyPhone("07307986069");

       member.setEmail("fhq2006@126.com");

       member.setHomePhone("07307986069");

       member.setMail("414100");

       member.setPassword("136136");

       member.setUsername("fhqiu");

       member.setSex("");

       member.setRealName("赵洋");

       member.setComments(comments);

     session.save(member);

注:可以发现用了级联生,我们可以用session.save(comment2);保存了,而是直接session.save(member);

 

4)一对多端一端的保存,在一端存在的情况下,从一端对多端数据的保存(有级联的保存)

申明:此种保存,本人并不建议

       Comment comment1=new Comment();

       comment1.setCommentDate(new Date());

       comment1.setText("我来测试1");

      

      

       Comment comment2=new Comment();

       comment2.setCommentDate(new Date());

       comment2.setText("我来测试2");

      

      

       Set<Comment> comments=new HashSet<Comment>();

       comments.add(comment1);

       comments.add(comment2);

      

       Member member =new Member();

       Query query=session.createQuery("from Member where username='fhqiu'");

       List list=query.list();

      

       Iterator iterator=list.iterator();

       while(iterator.hasNext()){

           member=(Member)iterator.next();

       }

       member.getComments().addAll(comments);

      

     session.update(member);

此种保存首先必须取出一端数据,并用member.getComments().addAll(comments);

,这里要强调的是必须用上面的语句,切记不可用member.setComments(comments)。因为这样将丢失以前保存的所有数据.

 

5)一对多端一端的删除,从一端删除数据(有级联的删除,删除会员相关的所有信息)

我们这里的删除都用了级联,将一端删除意味着,将与一端相关联的数据全部删除,

这一般实际时,有这样的情况,如果不想全部删除则设置cascade=”save-update”

       Member member =new Member();

       Query query=session.createQuery("from Member where username='fhqiu'");

       List list=query.list();

      

       Iterator iterator=list.iterator();

       while(iterator.hasNext()){

           member=(Member)iterator.next();

       }  

      session.delete(member);

6)一对多端一端的更新(只介绍一端的自身更新,用一端更新多端,没有太多的实际价值)

 

       Member member =new Member();

       Query query=session.createQuery("from Member where username='fhqiu'");

       List list=query.list();

      

       Iterator iterator=list.iterator();

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值