Hibernate——笔记03

版权声明:转载请联系作者本人!!! https://blog.csdn.net/weixin_42061805/article/details/83243806

表与表的关系

  1. 一对一
  2. 一对多(常用)
  3. 多对多(常用)注:需要建立第三张表

一对多操作

  1. 实体类以及实体之间的关系的创建
  2. 映射文件的配置映射文件的配置
  3. 核心配置文件的配置
  4. 具体的操作
    1)cascade属性:级联操作
    2)级联保存
    3)级联删除
实体类
package tqb.entity;

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

public class Customer {
	// 客户id
	private Integer cid;
	// 客户名称
	private String custName;
	// 客户级别
	private String custLevel;
	// 客户来源
	private String custSource;
	// 联系电话
	private String custPhone;
	// 手机
	private String custMobile;

	// 在客户实体类里面表示多个联系人,一个客户有多个联系人
	// hibernate要求使用集合表示多的数据,使用set集合
	private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();

	public Set<LinkMan> getSetLinkMan() {
		return setLinkMan;
	}

	public void setSetLinkMan(Set<LinkMan> setLinkMan) {
		this.setLinkMan = setLinkMan;
	}

	public Integer getCid() {
		return cid;
	}

	public void setCid(Integer cid) {
		this.cid = cid;
	}

	public String getCustName() {
		return custName;
	}

	public void setCustName(String custName) {
		this.custName = custName;
	}

	public String getCustLevel() {
		return custLevel;
	}

	public void setCustLevel(String custLevel) {
		this.custLevel = custLevel;
	}

	public String getCustSource() {
		return custSource;
	}

	public void setCustSource(String custSource) {
		this.custSource = custSource;
	}

	public String getCustPhone() {
		return custPhone;
	}

	public void setCustPhone(String custPhone) {
		this.custPhone = custPhone;
	}

	public String getCustMobile() {
		return custMobile;
	}

	public void setCustMobile(String custMobile) {
		this.custMobile = custMobile;
	}

	@Override
	public String toString() {
		return "Customer [cid=" + cid + ", custName=" + custName + ", custLevel=" + custLevel + ", custSource="
				+ custSource + ", custPhone=" + custPhone + ", custMobile=" + custMobile + ", setLinkMan=" + setLinkMan
				+ "]";
	}

}

package tqb.entity;

public class LinkMan {

	private Integer lkm_id; // 联系人编号(主键)
	private String lkm_name;// 联系人姓名
	private String lkm_gender;// 联系人性别
	private String lkm_phone;// 联系人办公电话

	// 在联系人实体类里面表示所属客户,一个联系人只能属于一个客户
	private Customer customer;

	public Customer getCustomer() {
		return customer;
	}

	public void setCustomer(Customer customer) {
		this.customer = customer;
	}

	public Integer getLkm_id() {
		return lkm_id;
	}

	public void setLkm_id(Integer lkm_id) {
		this.lkm_id = lkm_id;
	}

	public String getLkm_name() {
		return lkm_name;
	}

	public void setLkm_name(String lkm_name) {
		this.lkm_name = lkm_name;
	}

	public String getLkm_gender() {
		return lkm_gender;
	}

	public void setLkm_gender(String lkm_gender) {
		this.lkm_gender = lkm_gender;
	}

	public String getLkm_phone() {
		return lkm_phone;
	}

	public void setLkm_phone(String lkm_phone) {
		this.lkm_phone = lkm_phone;
	}

	@Override
	public String toString() {
		return "LinkMan [lkm_id=" + lkm_id + ", lkm_name=" + lkm_name + ", lkm_gender=" + lkm_gender + ", lkm_phone="
				+ lkm_phone + ", customer=" + customer + "]";
	}

}

映射文件的配置
<?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>
	<!-- 1 配置类和表对应 
		class标签
		name属性:实体类全路径
		table属性:数据库表名称
	-->
	<class name="tqb.entity.Customer" table="t_customer">
		<id name="cid" column="cid">
			<generator class="native"></generator>
		</id>
		<property name="custName" column="custName"></property>
		<property name="custLevel" column="custLevel"></property>
		<property name="custSource" column="custSource"></property>
		<property name="custPhone" column="custPhone"></property>
		<property name="custMobile" column="custMobile"></property>
		
		<!-- 
			name:实体关系中多对一(多)对应的对象名称
		 -->
		<set name="setLinkMan" cascade="save-update,delete">
			<!-- column:实体关系中多对一(多)对应的表字段名称 -->
			<key column="clid"></key>
			<!-- class:实体关系中多对一(多)对应实体的全路径 -->
			<one-to-many class="tqb.entity.LinkMan"/>
		</set>
	</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!-- 对hibernate配置文件的dtd约束 -->
<!-- hibernate-mapping为父标签 -->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- hibernate的配置文件 -->
<hibernate-mapping>
	<!-- 
		name:实体类的全路径
		table:数据库对应的表名
	 -->
	<class name="tqb.entity.LinkMan" table="t_linkman">
		<!-- 
			hibernate中必须有一个具有唯一值的属性
			name:实体中id的属性名
			column:就是表中的字段
		 -->
		<id name="lkm_id" column="lkm_id">
			<generator class="native"></generator>
		</id>
		<property name="lkm_name" column="lkm_name"></property>
		<property name="lkm_gender" column="lkm_gender"></property>
		<property name="lkm_phone" column="lkm_phone"></property>
		
		<!-- 多对一 -->
		<!-- 
			name:多对一中(一)实体中对应的对象名称
			class:多对一中(一)实体的全路径
			column:多对一中(多)对应表中的外键字段名称
		 -->
		<many-to-one name="customer" class="tqb.entity.Customer" column="clid"></many-to-one>
		
	</class>
</hibernate-mapping>
核心文件的配置
<!-- 加载表单项配置文件 -->
		<mapping resource="tqb/entity/Customer.hbm.xml"/>
		<mapping resource="tqb/entity/LinkMan.hbm.xml"/>
级联保存

注:在Customer映射文件中的set标签添加如下属性信息cascade="save-update"

<set name="setLinkMan" cascade="save-update">
			<!-- column:实体关系中多对一(多)对应的表字段名称 -->
			<key column="clid"></key>
			<!-- class:实体关系中多对一(多)对应实体的全路径 -->
			<one-to-many class="tqb.entity.LinkMan"/>
		</set>
package tqb.test;

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

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import tqb.entity.Customer;
import tqb.entity.LinkMan;
import utils.HibernateUtils;

/**
 * 级联添加数据
 * 
 * @author tqb
 *
 */
public class Demo {
	
	/**
	 * 该方法较另一种(该方法下面)麻烦
	 */
	@Test
	public void add1() {
		Session session = null;

		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
		
			//给实体添加数据
			Customer customer = new Customer();
			customer.setCustName("Tencent");
			customer.setCustLevel("VIP");
			customer.setCustSource("IT");
			customer.setCustPhone("2222222");
			
			
			LinkMan linkMan = new LinkMan();
			linkMan.setLkm_name("马化腾");
			linkMan.setLkm_gender("male");
			linkMan.setLkm_phone("15200000000");
			customer.getSetLinkMan().add(linkMan);
			
			linkMan.setCustomer(customer);
			
			//向数据库中添加数据
			session.save(customer);
			session.save(linkMan);
			
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		}
	}
	
	/**
	 * 配置文件后较上边的方法简便
	 * 在Customer实体对应的配置文件set中添加如下属性
	 * <set name="setLinkMan" cascade="save-update">
	 */
	@Test
	public void add2() {
		Session session = null;

		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
		
			//给实体添加数据
			Customer customer = new Customer();
			customer.setCustName("Alibaba");
			customer.setCustLevel("VIP");
			customer.setCustSource("IT");
			customer.setCustPhone("33333333");
			
			
			LinkMan linkMan = new LinkMan();
			linkMan.setLkm_name("杰克马");
			linkMan.setLkm_gender("male");
			linkMan.setLkm_phone("15800000000");
			customer.getSetLinkMan().add(linkMan);
			
			//向数据库中添加数据
			session.save(customer);
			
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		}
	}
}
级联删除数据

注:在Customer映射文件中的set标签添加如下属性信息cascade="delete"

<set name="setLinkMan" cascade="delete">
			<!-- column:实体关系中多对一(多)对应的表字段名称 -->
			<key column="clid"></key>
			<!-- class:实体关系中多对一(多)对应实体的全路径 -->
			<one-to-many class="tqb.entity.LinkMan"/>
		</set>
package tqb.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import tqb.entity.Customer;
import utils.HibernateUtils;

/**
 * 一对多的级联删除
 * 在Customer实体对应的配置文件中添加如下内容
 * <set name="setLinkMan" cascade="delete">
 * 或(同一属性的多个值)
 * <set name="setLinkMan" cascade="save-update,delete">
 * @author tqb
 *
 */
public class Demo2 {

	@Test
	public void delete(){
		Session session = null;

		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
		
			Customer customer = session.get(Customer.class, 2);
			session.delete(customer);
			
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		}
	}
}

原理:

	/**
	 * 原理实现
Hibernate: 
    select
        customer0_.cid as cid1_0_0_,
        customer0_.custName as custName2_0_0_,
        customer0_.custLevel as custLeve3_0_0_,
        customer0_.custSource as custSour4_0_0_,
        customer0_.custPhone as custPhon5_0_0_,
        customer0_.custMobile as custMobi6_0_0_ 
    from
        t_customer customer0_ 
    where
        customer0_.cid=?
Hibernate: 
    select
        setlinkman0_.clid as clid5_1_0_,
        setlinkman0_.lkm_id as lkm_id1_1_0_,
        setlinkman0_.lkm_id as lkm_id1_1_1_,
        setlinkman0_.lkm_name as lkm_name2_1_1_,
        setlinkman0_.lkm_gender as lkm_gend3_1_1_,
        setlinkman0_.lkm_phone as lkm_phon4_1_1_,
        setlinkman0_.clid as clid5_1_1_ 
    from
        t_linkman setlinkman0_ 
    where
        setlinkman0_.clid=?
Hibernate: 
    update
        t_linkman 
    set
        clid=null 
    where
        clid=?
Hibernate: 
    delete 
    from
        t_linkman 
    where
        lkm_id=?
Hibernate: 
    delete 
    from
        t_customer 
    where
        cid=?
	 */

多对多操作

  1. 实体类以及实体之间的关系的创建
  2. 映射文件的配置映射文件的配置
  3. 核心配置文件的配置
  4. 具体的操作
  5. 第三张表的维护
实体类
package tqb.entity.manytomany;

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

public class User {
  	private Integer user_id;//用户id
  	private String user_name;//用户名称
  	private String user_password;//用户密码
  	
  	//一个用户可以有多个角色
  	private Set<Role> setRole = new HashSet<Role>();
  	
	public Set<Role> getSetRole() {
		return setRole;
	}
	public void setSetRole(Set<Role> setRole) {
		this.setRole = setRole;
	}
	public Integer getUser_id() {
		return user_id;
	}
	public void setUser_id(Integer user_id) {
		this.user_id = user_id;
	}
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String user_name) {
		this.user_name = user_name;
	}
	public String getUser_password() {
		return user_password;
	}
	public void setUser_password(String user_password) {
		this.user_password = user_password;
	}
}

package tqb.entity.manytomany;

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

public class Role {
  	private Integer role_id;//角色id
  	private String role_name;//角色名称
  	private String role_memo;//角色描述
  	
  	// 一个角色有多个用户
  	private Set<User> setUser = new HashSet<User>();
  	
	public Set<User> getSetUser() {
		return setUser;
	}
	public void setSetUser(Set<User> setUser) {
		this.setUser = setUser;
	}
	public Integer getRole_id() {
		return role_id;
	}
	public void setRole_id(Integer role_id) {
		this.role_id = role_id;
	}
	public String getRole_name() {
		return role_name;
	}
	public void setRole_name(String role_name) {
		this.role_name = role_name;
	}
	public String getRole_memo() {
		return role_memo;
	}
	public void setRole_memo(String role_memo) {
		this.role_memo = role_memo;
	}
}

映射文件配置
<?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>
	<!-- 1 配置类和表对应 
		class标签
		name属性:实体类全路径
		table属性:数据库表名称
	-->
	<class name="tqb.entity.manytomany.User" table="t_user">
		<id name="user_id" column="user_id">
			<generator class="native"></generator>
		</id>
		<property name="user_name" column="user_name"></property>
		<property name="user_password" column="user_password"></property>
		<!-- table:第三张表名 -->
		<set name="setRole" table="user_role" cascade="save-update">
			<key column="user_id"></key>
			<many-to-many class="tqb.entity.manytomany.Role" column="role_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

<?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>
	<!-- 1 配置类和表对应 
		class标签
		name属性:实体类全路径
		table属性:数据库表名称
	-->
	<class name="tqb.entity.manytomany.Role" table="t_role">
		<id name="role_id" column="role_id">
			<generator class="native"></generator>
		</id>
		<property name="role_name" column="role_name"></property>
		<property name="role_memo" column="role_memo"></property>
		<set name="setUser" table="user_role">
			<key column="role_id"></key>
			<many-to-many class="tqb.entity.manytomany.User" column="user_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>
级联保存数据与级联删除(级联删除几乎不用)
package tqb.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import tqb.entity.manytomany.Role;
import tqb.entity.manytomany.User;
import utils.HibernateUtils;

public class ManyToManyDemo {
	/**
	 * 级联保存
	 */
	@Test
	public void funadd() {
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
			
			User user1 = new User();
			User user2 = new User();
			
			user1.setUser_name("zhangsan");
			user1.setUser_password("123");
			user2.setUser_name("lisi");
			user2.setUser_password("456");
			
			Role role1 = new Role();
			Role role2 = new Role();
			Role role3 = new Role();
			
			role1.setRole_name("总经理");
			role1.setRole_memo("总经理");
			role2.setRole_name("董事长");
			role2.setRole_memo("董事长");
			role3.setRole_name("保卫科长");
			role3.setRole_memo("保卫科长");
			
			user1.getSetRole().add(role1);
			user1.getSetRole().add(role2);
			user2.getSetRole().add(role2);
			user2.getSetRole().add(role3);
			
			session.save(user1);
			session.save(user2);
			
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		}
	}
	
	/**
	 * 级联删除
	 * 危险性太高,不建议使用(只提供方法,不使用)
	 */
	@Test
	public void fundelete() {
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
			
			User user = session.get(User.class, 1);
			/*
			 * 结果为:
			 * 	三张表与user_id=1有关系的全部删除
			 */
			session.delete(user);
			
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		}
	}
	
	/**
	 * 维护第三张表
	 * 即给第三张表添加数据和删除数据
	 */
	@Test
	public void user_role() {
		Session session = null;
		Transaction transaction = null;
		try {
			session = HibernateUtils.getSessionObject();
			transaction = session.beginTransaction();
			
			/*
			 * 给第一个用户添加第三种角色
			 */
//			User user = session.get(User.class, 1);
//			Role role = session.get(Role.class, 3);
//			user.getSetRole().add(role);
			
			/*
			 * 第一个用户删除第三种角色
			 */
			User user = session.get(User.class, 1);
			Role role = session.get(Role.class, 3);
			user.getSetRole().remove(role);
		
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42061805/article/details/83243806
今日推荐