HIbernate的一对多操作:

  1. 创建实体类:一个Customer类(客户类)和一个LinkMan类(联系人),两者的关系为:一个客户中可能有多个联系人(关于一对多的实体类之间的关联,不做详细介绍,看下代码)。

  Customer:

package com.geore.pojo.customer;

import java.util.HashSet;
import java.util.Set; import com.geore.pojo.linkman.LinkMan; public class Customer {
private String cid = null;
private String custLevel = null;
private String custName = null;
private String custSource = null;
private String custMobile = null;
private Set<LinkMan> mans = new HashSet<LinkMan>(); @Override
public String toString() {
return "Customer [cid=" + cid + ", custLevel=" + custLevel
+ ", custName=" + custName + ", custSource="
+ custSource + ", custMobile=" + custMobile + "]";
} public String getCid() {
return cid;
} public void setCid(String cid) {
this.cid = cid;
} public String getCustLevel() {
return custLevel;
} public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
} public String getCustName() {
return custName;
} public void setCustName(String custName) {
this.custName = custName;
} public String getCustSource() {
return custSource;
} public void setCustSource(String custSource) {
this.custSource = custSource;
} public String getCustMobile() {
return custMobile;
} public void setCustMobile(String custMobile) {
this.custMobile = custMobile;
} public Set<LinkMan> getMans() {
return mans;
} public void setMans(Set<LinkMan> mans) {
this.mans = mans;
}
}

Customer

  LinkMan:

 package com.geore.pojo.linkman;

 import com.geore.pojo.customer.Customer;

 public class LinkMan {
private String lid = null;
private String linkName = null;
private String linkGender = null;
private String linkPhone = null;
private Customer customer = null; public LinkMan() {
super();
}
@Override
public String toString() {
return "LinkMan [lid=" + lid + ", linkName=" + linkName
+ ", linkGender=" + linkGender + ", linkPhone=" + linkPhone
+ ", customer=" + customer + "]";
}
public String getLid() {
return lid;
}
public void setLid(String lid) {
this.lid = lid;
}
public String getLinkName() {
return linkName;
}
public void setLinkName(String linkName) {
this.linkName = linkName;
}
public String getLinkGender() {
return linkGender;
}
public void setLinkGender(String linkGender) {
this.linkGender = linkGender;
}
public String getLinkPhone() {
return linkPhone;
}
public void setLinkPhone(String linkPhone) {
this.linkPhone = linkPhone;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}

LinkMan

  2. 配置实体类的Hibernate实体类配置文件

  对于Hibernate实体类的配置:第一,首先将基本的class,id和property等标签的内容配置好之后,因为在Customer中,是一个一对多的关系,因此在Customer实体类中用Set集合表示一个Customer可以拥有多个联系人(Hibernate规定,在表示一对多的时候,使用的集合必须为Set集合),因此在配置文件中,需要对这种关系进行配置,而Hibernate配置文件提供了一个set标签进行配置,具体配置见下代码:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.geore.pojo.customer.Customer" table="t_customer">
<id name="cid" column="cid">
<generator class="uuid"></generator>
</id>
<property name="custLevel" column="custLevel"></property>
<property name="custName" column="custName"></property>
<property name="custSource" column="custSource"></property>
<property name="custMobile" column="custMobile"></property>
<set name="mans" cascade="save-update,delete">
<key column="clid"></key>
<one-to-many class="com.geore.pojo.linkman.LinkMan"/>
</set>
</class>
</hibernate-mapping>

Customer.hbm.xml

  同时在LinkMan.hbm.xml文件中,也需要进行配置,因为Hibernate是进行双向关联,因此在LinkMan中也会有一个字段关联到Customer类,一般这个字段我们使用Customer的对象来表示,所以在xml文件中,也需要进行配置。

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.geore.pojo.linkman.LinkMan" table="t_linkman">
<id name="lid" column="lid">
<generator class="uuid"></generator>
</id>
<property name="linkName" column="linkName"></property>
<property name="linkGender" column="linkGender"></property>
<property name="linkPhone" column="linkPhone"></property>
<many-to-one name="customer" class="com.geore.pojo.customer.Customer" not-found="ignore">
<column name="clid"></column>
</many-to-one>
</class>
</hibernate-mapping>

LinkMan.hbm.xml

  3. 一对多的级联操作:

  (1)、保存操作

  代码片段:

 @Test
public void fun1() {
Transaction ts = null;
Session session = null;
SessionFactory factory = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
ts = session.beginTransaction();
// 一对多的操作
Customer customer = new Customer();
customer.setCustLevel("vip");
customer.setCustMobile("1378*******");
customer.setCustName("Geore");
customer.setCustSource("Baidu");
LinkMan linkman = new LinkMan();
linkman.setLinkGender("M");
linkman.setLinkName("Mr.Li");
linkman.setLinkPhone("****-*******");
// 添加兩個對象的之间的一对多关系
customer.getMans().add(linkman);
linkman.setCustomer(customer);
// 添加到数据库
session.save(customer);
session.save(linkman); ts.commit();
} catch (Exception e) {
ts.rollback();
e.printStackTrace();
} finally {
session.close();
}
} @Test
// 级联保存的简化写法
public void fun2() {
Transaction ts = null;
Session session = null;
SessionFactory factory = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
ts = session.beginTransaction();
// 一对多的操作
Customer customer = new Customer();
customer.setCustLevel("svip");
customer.setCustMobile("1378*******");
customer.setCustName("Alley");
customer.setCustSource("Google");
LinkMan linkman = new LinkMan();
linkman.setLinkGender("F");
linkman.setLinkName("Mr.Wang");
linkman.setLinkPhone("****-*******");
// 添加兩個對象的之间的一对多关系
customer.getMans().add(linkman);
// 添加到数据库
session.save(customer);
ts.commit();
} catch (Exception e) {
ts.rollback();
e.printStackTrace();
} finally {
session.close();
}
}

  运行截图:

对于上面的简单方法的插入,需要在Hibernate实体类的配置文件中进行配置,配置代码如下:

<set name="mans" cascade="save-update">
需要配置的就是cascade="save-update",这个save-update表示的就是自动的会对一对多的关系在HIbernate底层进行处理,配置了这个,就不需要在代码中双向关联对应的实体类对象了

  (2)、删除操作

  代码片段:

 @Test
// 级联删除操作,在set标签中进行配置
public void fun3() {
Transaction ts = null;
Session session = null;
SessionFactory factory = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
ts = session.beginTransaction(); // 通过id找到对应的数据记录
Customer customer = session.get(Customer.class,
"4028d4015e6dedd5015e6deddbeb0000");
session.delete(customer); ts.commit();
} catch (Exception e) {
ts.rollback();
e.printStackTrace();
} finally {
session.close();
}
}

  运行截图:

同样的,对于删除操作,因为是1对多,删除一个Customer,那么对应的Customer下的LinkMan也要删除,那么这样删除的话,同样要配置Hibernate的配置文件,来实现级联删除。代码如下:

 <set name="mans" cascade="save-update,delete">
<key column="clid"></key>
<one-to-many class="com.geore.pojo.linkman.LinkMan"/>
</set>
同样的也是在cascade中进行配置,在这个属性中给个只delete,至于之前保存操作的save-update不用删除,只需要在后面加上一个,号,在写上delete表示进行级联删除操作即可

  

  (3)、一对多表的维护操作

  代码片段:

 @Test
// 将Mr.wang公司修改带Baidu,加上not-found="ignore",否则报错,原因不明
public void fun4() {
Transaction ts = null;
Session session = null;
SessionFactory factory = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
ts = session.beginTransaction(); // 通过id找到baidu公司客户记录
Customer customer = session.get(Customer.class,
"4028d4015e6f04a6015e6f04ad120000");
System.out.println(customer);
// 通过id找到联系人Mr.wang的记录
LinkMan Mr_wang = session.get(LinkMan.class,
"4028d4015e6f04d3015e6f04da2c0001");
System.out.println(Mr_wang);
customer.getMans().add(Mr_wang);
Mr_wang.setCustomer(customer); ts.commit();
} catch (Exception e) {
ts.rollback();
e.printStackTrace();
} finally {
session.close();
}
}

  运行截图:

  注意:使用这个修改的时候,须在一对多的多方的实体类配置文件中,配置如下属性值:

<many-to-one name="customer" class="com.geore.pojo.customer.Customer" not-found="ignore">
就是not-found="ignore",现在还没有发现具体造成原因,不加上此句将报异常

Hibernate 多对多的操作

1. 创建多对多的实体类,并且在实体类中建立起表的多对多关系(用户表和角色表,一个用户可以有多个角色,一个角色也可以属于多个用户),实体类如下:

  Role:

 package com.geore.pojo.role;

 import java.util.HashSet;
import java.util.Set; import com.geore.pojo.users.Users; public class Role {
private String rid = null;
private String roleName = null;
private String roleMemo = null;
private Set<Users> users = new HashSet<Users>(); public Set<Users> getUsers() {
return users;
}
public void setUsers(Set<Users> users) {
this.users = users;
}
@Override
public String toString() {
return "Role [rid=" + rid + ", roleName=" + roleName + ", roleMemo="
+ roleMemo + "]";
}
public String getRid() {
return rid;
}
public void setRid(String rid) {
this.rid = rid;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRoleMemo() {
return roleMemo;
}
public void setRoleMemo(String roleMemo) {
this.roleMemo = roleMemo;
}
}

Role

  Users:

 package com.geore.pojo.users;

 import java.util.HashSet;
import java.util.Set; import com.geore.pojo.role.Role; public class Users {
private String uid = null;
private String username = null;
private String password = null;
private Set<Role> roles = new HashSet<Role>(); public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
@Override
public String toString() {
return "Users [uid=" + uid + ", username=" + username + ", password="
+ password + "]";
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

Users

2. 多对多关系的配置文件,Hibernate的多对多也是进行双向关联,因此对于多对多关系的两表均需要进行配置

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.geore.pojo.users.Users" table="t_users">
<id name="uid" column="uid">
<generator class="uuid"></generator>
</id>
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<set name="roles" table="t_roleuser" cascade="save-update,delete">
<key column="userId"></key>
<many-to-many class="com.geore.pojo.role.Role" column="roleId"></many-to-many>
</set>
</class>
</hibernate-mapping>

Users.hbm.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.geore.pojo.role.Role" table="t_role">
<id name="rid" column="rid">
<generator class="uuid"></generator>
</id>
<property name="roleName" column="roleName"></property>
<property name="roleMemo" column="roleMemo"></property>
<set name="users" table="t_roleuser" cascade="save-update,delete">
<!-- 第三张表中Users表的外键id -->
<key column="roleId"></key>
<!-- class:表示的是set集合关联的对象的全路径;column:表示关联表在第三张表中的外键 -->
<many-to-many class="com.geore.pojo.users.Users" column="userId"></many-to-many>
</set>
</class>
</hibernate-mapping>

Role.hbm.xml

  对于这两个配置文件而言,因为是多对多的关系,因此在实体类中均需要集合进行保存,因此在配置文件中使用set标签来配置多对多的关系,又因为对于多对多的关系,一般使用的是第三张表来维护多对多的欢喜,因此在set标签中有一个属性table,表示的就是第三张表的名字.

3. 多对多的级练操作

  (1)、保存操作:

代码片段:

 @Test
public void fun1() {
// 多对多级练操作
Transaction ts = null;
Session session = null;
SessionFactory factory = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
ts = session.beginTransaction(); // 往用户中添加角色
Users u1 = new Users();
u1.setUsername("Alley");
u1.setPassword("123456"); Users u2 = new Users();
u2.setUsername("Mary");
u2.setPassword("456789");
// 设置角色
Role r1 = new Role();
r1.setRoleName("HR");
r1.setRoleMemo("HR"); Role r2 = new Role();
r2.setRoleName("Teacher");
r2.setRoleMemo("Teacher"); Role r3 = new Role();
r3.setRoleName("CEO");
r3.setRoleMemo("CEO");
// 用户1添加角色r1,r2
u1.getRoles().add(r1);
u1.getRoles().add(r2);
// 用户2添加角色r13,r2
u2.getRoles().add(r3); session.save(u2);
session.save(u1); ts.commit();
} catch (Exception e) {
ts.rollback();
e.printStackTrace();
} finally {
session.close();
}
}

  对于多对多的级联保存操作,也需要对实体类的配置文件的set标签的cascade属性进行配置,如下:

 <set name="users" table="t_roleuser" cascade="save-update">

运行截图:

(2)、级联删除操作

代码片段:

 // 级联删除
@Test
public void fun2() {
// 多对多级练操作
Transaction ts = null;
Session session = null;
SessionFactory factory = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
ts = session.beginTransaction(); // 第一步:查找用戶
Users user = session.get(Users.class,
"4028d4015e6f140b015e6f1411490000");
session.delete(user); ts.commit();
} catch (Exception e) {
ts.rollback();
e.printStackTrace();
} finally {
session.close();
}
}

同样的级联删除也需要配置实体类的HIbernate配置文件,如下:

 <set name="users" table="t_roleuser" cascade="save-update,delete">

运行截图:

(3)、维护第三种表

  >>>.维护第三张表---为用户添加新的角色(给Mary添加Teacher职责)

代码片段:

 // 维护第三张表---为用户添加新的角色
@Test
public void fun3() {
// 多对多级练操作
Transaction ts = null;
Session session = null;
SessionFactory factory = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
ts = session.beginTransaction(); // 第一步:查找用戶,
Users user = session.get(Users.class,
"4028d4015e6f1fe3015e6f1fe99a0000");
// 查找角色
Role role = session.get(Role.class,
"4028d4015e6f1fe3015e6f1fe9da0004");
// 添加角色到用户
user.getRoles().add(role); ts.commit();
} catch (Exception e) {
ts.rollback();
e.printStackTrace();
} finally {
session.close();
}
}

运行截图:

  >>>.维护第三张表---删除为用户的角色(删除Mary添加Teacher职责)

代码片段:

 // 维护第三张表---一处用户的某个角色
@Test
public void fun4() {
// 多对多级练操作
Transaction ts = null;
Session session = null;
SessionFactory factory = null;
try {
factory = Tools.getSessionFactory();
session = factory.openSession();
ts = session.beginTransaction(); // 第一步:查找用戶,
Users user = session.get(Users.class,
"4028d4015e6f1fe3015e6f1fe99a0000");
// 查找角色
Role role = session.get(Role.class,
"4028d4015e6f1fe3015e6f1fe9da0004");
// 添加角色到用户
user.getRoles().remove(role); ts.commit();
} catch (Exception e) {
ts.rollback();
e.printStackTrace();
} finally {
session.close();
}
}

运行截图:

HIbernate入门3的更多相关文章

  1. 三大框架之hibernate入门

    hibernate入门   1.orm      hibernate是一个经典的开源的orm[数据访问中间件]框架           ORM( Object Relation Mapping)对象关 ...

  2. Hibernate入门案例及增删改查

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  3. Hibernate入门案例 增删改

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  4. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  5. Hibernate入门5持久化对象关系和批量处理技术

    Hibernate入门5持久化对象关系和批量处理技术 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hiberna ...

  6. Hibernate入门4.核心技能

    Hibernate入门4.核心技能 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hibernate3的基本知识, ...

  7. Hibernate入门3.配置映射文件深入

    Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...

  8. 简单的Hibernate入门简介

    其实Hibernate本身是个独立的框架,它不需要任何web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了很多非Hibernate的东西, ...

  9. Hibernate入门(1)-第一个Hibernate程序

    Hibernate入门(1)-第一个Hibernate程序 Hibernate是最著名的ORM工具之一,本系列文章主要学习Hibernate的用法,不涉及Hibernate的原理.本文介绍第一个Hib ...

  10. hibernate入门之person表

    下面的hibernate入门person表指的是:根据mysql数据库中的test表和其中的元素-->建立映射表==>进而创建持久化类的顺序来操作了,下面为步骤 1.配置MySQL驱动程序 ...

随机推荐

  1. 03Java基础——继承

    1.继承 例如一个员工类,包括开发员工和经理. package cn.jxufe.java.chapter2.demo12; public class Employee { String name; ...

  2. 在目标端重建sequence的脚本

    select 'create sequence '||SEQUENCE_OWNER||'.'||sequence_name|| ' minvalue '||min_value|| ' maxvalue ...

  3. AGC009题解

    为了1天4题的flag不倒所以开新坑... B. 考虑把这棵树直接建出来,f[i]表示i最少的比赛次数,然后按照定义转移就行了. //Love and Freedom. #include<cst ...

  4. 2016.5.21【初中部 NOIP提高组】模拟赛A​ 总结

    这次比赛的题目看上去好像不难,但当开始仔细想的时候才发现,并没有那么简单. T1旅行:刚开始看到k<=4的时候还以为有题可以AC了,不过呢,还是毫无思路. T3Pty爬山:雨天的尾巴最近打了几道 ...

  5. 【JavaScript】 模拟JQuery的连续调用函数

    连续调用,了解调用主体 var zhangsan = { smoke: function () { console.log("Smoking..."); return this; ...

  6. luogu P1217 [USACO1.5]回文质数 Prime Palindromes x

    P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...

  7. [CF Round603 Div2 F]Economic Difficulties

    题目:Economic Difficulties 传送门:https://codeforces.com/contest/1263/problem/F 题意:给了两棵tree:Ta(拥有a个节点,节点编 ...

  8. Web引用中文个性字体

    最近在前端开发时,因为设计的原因,要引用一些特殊字体(otf格式),但是后来发现这些字体文件非常大,平均每个要8mb左右,严重影响了网页效率.经过一番搜索,发现了前端字体压缩工具(只支持utf-8格式 ...

  9. 在bash脚本的for i in编写中将点号``写成单引号‘’或者双引号“”会有什么后果?

    编写一个测试脚本: 输入启动命令:https://blog.csdn.net/zhoucheng05_13/article/details/test.sh,结果报错 使用的是root用户,但是仍然提示 ...

  10. idea中svn代码冲突

    1.鼠标右键点击项目根目录 --> 2.选择 subversion --> 3.resolve Text Confict --> 4.merge 手动编辑冲突部分,解决后就能正常提交 ...