hibernate_day03_多表操作

多表分析和创建

一对一

类的创建

实例

原则

在夫类里面有一个妻类的对象

在任意一方都有对方的对象引用

在妻类里面有一个夫类的对象

在任意一方都有对方的对象引用

数据库表的创建

默认创建表结构

一对多

实体类的创建

实例

原则

在客户类中有联系人类的集合

在一的一方有多的一方的集合

在联系人类中有客户的对象

在多的一方有一的一方的对象

数据库表的创建

在多的一方创建一个字段,这个字段作为外键,指向一的一方的主键

多对多

实体类的创建

实例

原则

在用户类中有角色类的集合

在任意一方都需要有对方的集合

在角色类中有用户类的集合

在任意一方都需要有对方的集合

数据库表的创建

创建一张中间表,这个中间表里至少需要2个字段,让这2个字段当成是外键指向各自表的主键

一对多关系映射

准备

创建客户表

CREATE TABLE `cst_customer` (
  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  `cust_address` varchar(128) DEFAULT NULL COMMENT '客户联系地址',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '客户联系电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

创建联系人表

CREATE TABLE `cst_linkman` (
  `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',
  `lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',
  `lkm_cust_id` bigint(32) NOT NULL COMMENT '客户id',
  `lkm_gender` char(1) DEFAULT NULL COMMENT '联系人性别',
  `lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
  `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',
  `lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
  `lkm_qq` varchar(16) DEFAULT NULL COMMENT '联系人qq',
  `lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',
  `lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',
  PRIMARY KEY (`lkm_id`),
  KEY `FK_cst_linkman_lkm_cust_id` (`lkm_cust_id`),
  CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 创建实体类

package com.itheima.domain;

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

/**
 * @ClassName: Customer
 * @Description:客户类
 * @author jsz
 * @date 2018年8月18日
 */
public class Customer {

	private Long cust_id;
	private String cust_name;
	private String cust_source;
	private String cust_industry;
	private String cust_level;
	private String cust_phone;
	private String cust_address;
	private Set<LinkMan> linkMans = new HashSet<LinkMan>();

	public Customer() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Customer(Long cust_id, String cust_name, String cust_source, String cust_industry, String cust_level,
			String cust_phone, String cust_address, Set<LinkMan> linkMans) {
		super();
		this.cust_id = cust_id;
		this.cust_name = cust_name;
		this.cust_source = cust_source;
		this.cust_industry = cust_industry;
		this.cust_level = cust_level;
		this.cust_phone = cust_phone;
		this.cust_address = cust_address;
		this.linkMans = linkMans;
	}

	public Long getCust_id() {
		return cust_id;
	}

	public void setCust_id(Long cust_id) {
		this.cust_id = cust_id;
	}

	public String getCust_name() {
		return cust_name;
	}

	public void setCust_name(String cust_name) {
		this.cust_name = cust_name;
	}

	public String getCust_source() {
		return cust_source;
	}

	public void setCust_source(String cust_source) {
		this.cust_source = cust_source;
	}

	public String getCust_industry() {
		return cust_industry;
	}

	public void setCust_industry(String cust_industry) {
		this.cust_industry = cust_industry;
	}

	public String getCust_level() {
		return cust_level;
	}

	public void setCust_level(String cust_level) {
		this.cust_level = cust_level;
	}

	public String getCust_phone() {
		return cust_phone;
	}

	public void setCust_phone(String cust_phone) {
		this.cust_phone = cust_phone;
	}

	public String getCust_address() {
		return cust_address;
	}

	public void setCust_address(String cust_address) {
		this.cust_address = cust_address;
	}

	public Set<LinkMan> getLinkMans() {
		return linkMans;
	}

	public void setLinkMans(Set<LinkMan> linkMans) {
		this.linkMans = linkMans;
	}

	@Override
	public String toString() {
		return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_source=" + cust_source
				+ ", cust_industry=" + cust_industry + ", cust_level=" + cust_level + ", cust_phone=" + cust_phone
				+ ", cust_address=" + cust_address + ", linkMans=" + linkMans + "]";
	}

}
package com.itheima.domain;

/**
 * @ClassName: LinkMan
 * @Description:联系人类
 * @author jsz
 * @date 2018年8月18日
 */
public class LinkMan {

	private Long lkm_id;
	private String lkm_name;
	private String lkm_gender;
	private String lkm_phone;
	private String lkm_mobile;
	private String lkm_email;
	private String lkm_qq;
	private String lkm_position;
	private String lkm_memo;
	private Customer customer;

	public LinkMan() {
		super();
		// TODO Auto-generated constructor stub
	}

	public LinkMan(Long lkm_id, String lkm_name, String lkm_gender, String lkm_phone, String lkm_mobile,
			String lkm_email, String lkm_qq, String lkm_position, String lkm_memo, Customer customer) {
		super();
		this.lkm_id = lkm_id;
		this.lkm_name = lkm_name;
		this.lkm_gender = lkm_gender;
		this.lkm_phone = lkm_phone;
		this.lkm_mobile = lkm_mobile;
		this.lkm_email = lkm_email;
		this.lkm_qq = lkm_qq;
		this.lkm_position = lkm_position;
		this.lkm_memo = lkm_memo;
		this.customer = customer;
	}

	public Long getLkm_id() {
		return lkm_id;
	}

	public void setLkm_id(Long 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;
	}

	public String getLkm_mobile() {
		return lkm_mobile;
	}

	public void setLkm_mobile(String lkm_mobile) {
		this.lkm_mobile = lkm_mobile;
	}

	public String getLkm_email() {
		return lkm_email;
	}

	public void setLkm_email(String lkm_email) {
		this.lkm_email = lkm_email;
	}

	public String getLkm_qq() {
		return lkm_qq;
	}

	public void setLkm_qq(String lkm_qq) {
		this.lkm_qq = lkm_qq;
	}

	public String getLkm_position() {
		return lkm_position;
	}

	public void setLkm_position(String lkm_position) {
		this.lkm_position = lkm_position;
	}

	public String getLkm_memo() {
		return lkm_memo;
	}

	public void setLkm_memo(String lkm_memo) {
		this.lkm_memo = lkm_memo;
	}

	public Customer getCustomer() {
		return customer;
	}

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

	@Override
	public String toString() {
		return "LinkMan [lkm_id=" + lkm_id + ", lkm_name=" + lkm_name + ", lkm_gender=" + lkm_gender + ", lkm_phone="
				+ lkm_phone + ", lkm_mobile=" + lkm_mobile + ", lkm_email=" + lkm_email + ", lkm_qq=" + lkm_qq
				+ ", lkm_position=" + lkm_position + ", lkm_memo=" + lkm_memo + ", 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>
	<class name="com.itheima.domain.Customer" table="cst_customer" catalog="crm">
		<id name="cust_id" column="cust_id">
			<!-- generator:主键生成策略  native:主键自动增长-->
			<generator class="native" />
		</id>
		
		<property name="cust_name" column="cust_name" />
		<property name="cust_source" column="cust_source" />
		<property name="cust_industry" column="cust_industry" />
		<property name="cust_level" column="cust_level" />
		<property name="cust_address" column="cust_address" />
		<property name="cust_phone" column="cust_phone" />
		
		<!--set:配置一的一方 name:Javabean中集合的名称 inverse:放弃维护外键  lazy:延迟加载(默认:true)-->
		<set name="linkMans" inverse="true">
			<!-- column:表中外键 -->
			<key column="lkm_cust_id"></key>
			<!-- class:多的一方的类的全路径 -->
			<one-to-many class="com.itheima.domain.LinkMan"/>
		</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>

	<class name="com.itheima.domain.LinkMan" table="cst_linkman">
		<id name="lkm_id" column="lkm_id">
			<generator class="native" />
		</id>
		<property name="lkm_name" column="lkm_name" />
		<property name="lkm_gender" column="lkm_gender" />
		<property name="lkm_phone" column="lkm_phone" />
		<property name="lkm_mobile" column="lkm_mobile" />
		<property name="lkm_email" column="lkm_email" />
		<property name="lkm_qq" column="lkm_qq" />
		<property name="lkm_position" column="lkm_position" />
		<property name="lkm_memo" column="lkm_memo" />

		<!-- many-to-one:先配置多方 name:当前JavaBean中的属性 class:属性的全路径 cascade:级联操作 column:表中外键 lazy:延迟加载()-->
		<many-to-one name="customer" class="com.itheima.domain.Customer"
			cascade="save-update,delete" column="lkm_cust_id" />
	</class>
</hibernate-mapping>

级联保存

  • 保存谁,在谁的映射文件中配置cascade="save-update,delete"
  • 让另外一方放弃外键维护权
package com.itheima.test;

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

import com.itheima.domain.Customer;
import com.itheima.domain.LinkMan;
import com.itheima.utils.HibernateUtils;

/**
 * @ClassName: TestSave
 * @Description:级联保存
 * @author jsz
 * @date 2018年8月20日
 */
public class TestSave {

	/**
	 * @MethodName:test
	 * @Description:保存联系人,保存用户
	 * @throws Exception
	 */
	@Test
	public void test() throws Exception {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		Customer customer = new Customer();
		customer.setCust_name("张三");
		
		LinkMan l1 = new LinkMan();
		l1.setLkm_name("tom01");
		LinkMan l2 = new LinkMan();
		l2.setLkm_name("tom02");
		
		// 让联系人关联客户
		l1.setCustomer(customer);
		l2.setCustomer(customer);
		
		// 保存
		session.save(l1);
		session.save(l2);
		
		tx.commit();
	}

}

级联删除

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

import com.itheima.domain.Customer;
import com.itheima.domain.LinkMan;
import com.itheima.utils.HibernateUtils;

public class TestDelete {

	/**
	 * @MethodName:test01
	 * @Description:删除客服的时候,删除联系人
	 * @throws Exception
	 */
	@Test
	public void test01() throws Exception {
		Session session = HibernateUtils.getCurrentSession();
		Transaction transaction = session.beginTransaction();

		Customer customer = session.get(Customer.class, 5l);
		session.delete(customer);

		transaction.commit();

	}

	/**
	 * @MethodName:test02
	 * @Description:删除联系人的时候,删除客户(很少用)
	 * @throws Exception
	 */
	@Test
	public void test02() throws Exception {
		Session session = HibernateUtils.getCurrentSession();
		Transaction transaction = session.beginTransaction();

		LinkMan linkMan = session.get(LinkMan.class, 3l);
		session.delete(linkMan);

		transaction.commit();

	}

}

 冗余SQL的产生原因

hibernate一级缓存,让一方放弃外键的维护权

多对多关系映射

创建数据库

CREATE TABLE `sys_role` (
  `role_id` bigint(32) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(32) NOT NULL COMMENT '角色名称',
  `role_memo` varchar(128) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
CREATE TABLE `sys_user` (
  `user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `user_code` varchar(32) NOT NULL COMMENT '用户账号',
  `user_name` varchar(64) NOT NULL COMMENT '用户名称',
  `user_password` varchar(32) NOT NULL COMMENT '用户密码',
  `user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
CREATE TABLE `sys_user_role` (
  `role_id` bigint(32) NOT NULL COMMENT '角色id',
  `user_id` bigint(32) NOT NULL COMMENT '用户id',
  PRIMARY KEY (`role_id`,`user_id`),
  KEY `FK_user_role_user_id` (`user_id`),
  CONSTRAINT `FK_user_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_user_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 创建java类


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

/**
 * @ClassName: User
 * @Description:用户
 * @author jsz
 * @date 2018年8月20日
 */
public class User {
	private Long user_id;// '用户id',
	private String user_code;// '用户账号',
	private String user_name;// '用户名称',
	private String user_password;// '用户密码',
	private String user_state;// '1:正常,0:暂停',

	// 有角色的集合
	private Set<Role> roles = new HashSet<Role>();

	public User(Long user_id, String user_code, String user_name, String user_password, String user_state,
			Set<Role> roles) {
		super();
		this.user_id = user_id;
		this.user_code = user_code;
		this.user_name = user_name;
		this.user_password = user_password;
		this.user_state = user_state;
		this.roles = roles;
	}

	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Set<Role> getRoles() {
		return roles;
	}

	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}

	public Long getUser_id() {
		return user_id;
	}

	public void setUser_id(Long user_id) {
		this.user_id = user_id;
	}

	public String getUser_code() {
		return user_code;
	}

	public void setUser_code(String user_code) {
		this.user_code = user_code;
	}

	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;
	}

	public String getUser_state() {
		return user_state;
	}

	public void setUser_state(String user_state) {
		this.user_state = user_state;
	}

	@Override
	public String toString() {
		return "User [user_id=" + user_id + ", user_code=" + user_code + ", user_name=" + user_name + ", user_password="
				+ user_password + ", user_state=" + user_state + ", roles=" + roles + "]";
	}

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

/**
 * @ClassName: Role
 * @Description:角色
 * @author jsz
 * @date 2018年8月20日
 */
public class Role {
	private Long role_id;// 主键ID
	private String role_name;// '角色名称',
	private String role_memo;// '备注',
	// 有用户的集合
	private Set<User> users = new HashSet<User>();

	public Role(Long role_id, String role_name, String role_memo, Set<User> users) {
		super();
		this.role_id = role_id;
		this.role_name = role_name;
		this.role_memo = role_memo;
		this.users = users;
	}

	public Role() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Set<User> getUsers() {
		return users;
	}

	public void setUsers(Set<User> users) {
		this.users = users;
	}

	public Long getRole_id() {
		return role_id;
	}

	public void setRole_id(Long 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;
	}

	@Override
	public String toString() {
		return "Role [role_id=" + role_id + ", role_name=" + role_name + ", role_memo=" + role_memo + ", users=" + users
				+ "]";
	}

}

配置映射文件

<set name="当前Javabean中的集合名称" table="中间表的名称">
	<key column="当前Javabean在中间表的外键"/>
	<many-to-many class="集合中对象的全路径" column="集合中的对象在中间表的外键"/>
</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.itheima.domain.User" table="sys_user" catalog="crm">
		<id name="user_id" column="user_id">
			<generator class="native" />
		</id>

		<property name="user_code" column="user_code" />
		<property name="user_name" column="user_name" />
		<property name="user_password" column="user_password" />
		<property name="user_state" column="user_state" />

		<!-- 配置多对多 name:当前java类中的集合 table:中间表 -->
		<set name="roles" table="sys_user_role" cascade="save-update">
			<!-- column:当前java类在中间表的外键-->
			<key column="user_id" />
			<!-- class:集合中对象的全路径 column:集合中对象在中间表的外键的名称 -->
			<many-to-many class="com.itheima.domain.Role" column="role_id" />
		</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>

	<class name="com.itheima.domain.Role" table="sys_role" catalog="crm">
		<id name="role_id" column="role_id">
			<generator class="native" />
		</id>
		<property name="role_name" column="role_name" />
		<property name="role_memo" column="role_memo"></property>

		<!-- 配置多对多 name:当前java类中的集合  table:中间表 -->
		<set name="users" table="sys_user_role" cascade="save-update" inverse="true">
			<!-- column:当前java类在中间表的外键-->
			<key column="role_id" />
			<!-- class:集合中对象的全路径 column:集合中对象在中间表的外键的名称 -->
			<many-to-many class="com.itheima.domain.User" column="user_id" />
		</set>
	</class>


</hibernate-mapping>

 级联保存

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

import com.itheima.domain.Role;
import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;

public class Demo02 {

	/**
	 * @MethodName:test01
	 * @Description:双向关联
	 * @throws Exception
	 */
	@Test
	public void test01() throws Exception {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		User u1 = new User();
		u1.setUser_name("张三");
		User u2 = new User();
		u2.setUser_name("李四");

		Role r1 = new Role();
		r1.setRole_name("经理");
		Role r2 = new Role();
		r2.setRole_name("演员");

		// 双向关联
		u1.getRoles().add(r1);
		u1.getRoles().add(r2);
		r1.getUsers().add(u1);
		r2.getUsers().add(u1);

		u2.getRoles().add(r1);
		r1.getUsers().add(u2);
		
		session.save(u1);
		session.save(u2);
		session.save(r1);
		session.save(r2);
		tx.commit();
	}
	/**
	 * @MethodName:test02
	 * @Description:级联保存:保存用户,保存关联的角色
	 * @throws Exception
	 */
	@Test
	public void test02() throws Exception {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		User u1 = new User();
		u1.setUser_name("张三");
		User u2 = new User();
		u2.setUser_name("李四");
		
		Role r1 = new Role();
		r1.setRole_name("经理");
		Role r2 = new Role();
		r2.setRole_name("演员");
		
		// 单项关联
		u1.getRoles().add(r1);
		u1.getRoles().add(r2);
		u2.getRoles().add(r1);
		
		session.save(u1);
		session.save(u2);
		tx.commit();
	}

}

级联删除

import static org.junit.Assert.*;

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

import com.itheima.domain.Role;
import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;

public class Demo02 {

	/**
	 * @MethodName:test01
	 * @Description:双向关联
	 * @throws Exception
	 */
	@Test
	public void test01() throws Exception {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		User u1 = new User();
		u1.setUser_name("张三");
		User u2 = new User();
		u2.setUser_name("李四");

		Role r1 = new Role();
		r1.setRole_name("经理");
		Role r2 = new Role();
		r2.setRole_name("演员");

		// 双向关联
		u1.getRoles().add(r1);
		u1.getRoles().add(r2);
		r1.getUsers().add(u1);
		r2.getUsers().add(u1);

		u2.getRoles().add(r1);
		r1.getUsers().add(u2);
		
		session.save(u1);
		session.save(u2);
		session.save(r1);
		session.save(r2);
		tx.commit();
	}
	/**
	 * @MethodName:test02
	 * @Description:级联保存:保存用户,保存关联的角色
	 * @throws Exception
	 */
	@Test
	public void test02() throws Exception {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		User u1 = new User();
		u1.setUser_name("张三");
		User u2 = new User();
		u2.setUser_name("李四");
		
		Role r1 = new Role();
		r1.setRole_name("经理");
		Role r2 = new Role();
		r2.setRole_name("演员");
		
		// 单项关联
		u1.getRoles().add(r1);
		u1.getRoles().add(r2);
		u2.getRoles().add(r1);
		
		session.save(u1);
		session.save(u2);
		tx.commit();
	}

	/**
	 * @MethodName:test03
	 * @Description:级联删除,实际开发中不用,全部删除
	 * @throws Exception
	 */
	@Test
	public void test03() throws Exception {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		User user = session.get(User.class, 1l);
		session.delete(user);
		tx.commit();
	}
	
	/**
	 * @MethodName:test04
	 * @Description:删除张三的演员角色
	 * @throws Exception
	 */
	@Test
	public void test04() throws Exception {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		User u1 = session.get(User.class, 1l);
		Role r2 = session.get(Role.class, 2l);
		u1.getRoles().remove(r2);
		tx.commit();
	}

}

配置级联的原则

操作谁比较多,在XML文件中配置级联:cascade="save-update"

让另一方放弃外键维护权:inverse="true"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值