一、准备工作: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();