hibernate多对多增删

1、实体类User.java

package model;

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

public class User {
	private Long user_id;
	private String user_code;
	private String user_name;
	private String user_password;
	private String user_state;
	
	//用set集合来存多个角色
	private Set<Role> roles = new HashSet<>();
	
	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;
	}
}


2、实体类Role.java

package model;

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

public class Role {
	private Long role_id;
	private String role_name;
	private String role_memo;
	
	//使用set集合来存放多个用户
	private Set<User> users = new HashSet<>();
	
	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;
	}

	
}
3、实体类配置文件User.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="model.User" table="sys_user">
		<id name="user_id" column="user_id">
			<generator class="native"></generator>
		</id>
		<property name="user_code" column="user_code"></property>
		<property name="user_name" column="user_name"></property>
		<property name="user_password" column="user_password"></property>
		<property name="user_state" column="user_state"></property>
		<!-- 配置set集合描述User类中的roles属性和中间表信息 -->
		<!-- name:User类的roles属性
			table:中间表名称 -->
			<!-- 需要一方放弃外键维护 -->
			<!-- 多对多不可以级联删除cascade="delete" -->
		<set name="roles" table="sys_user_role" cascade="save-update">
			<!-- "user_id":user表在中间表的外键名称 -->
			<key column="user_id"></key>
			<!-- 配置角色表信息 -->
			<!-- column:中间表角色的外键 -->
			<many-to-many class="model.Role" column="role_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>
4、实体类配置文件Role.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="model.Role" table="sys_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>
		<!-- 配置用户表信息 -->
		<!-- 多对多不可以级联删除cascade="delete" -->
		<set name="users" table="sys_user_role" cascade="save-update">
			<!-- 角色在中间表的外键 -->
			<key column="role_id"></key>
			<!-- 配置用户的映射文件及在中间表的外键 -->
			<many-to-many class="model.User" column="user_id"></many-to-many>
		</set>
	</class>
</hibernate-mapping>
5、hibernate.cfg.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<!-- 配置连接信息 -->
	<session-factory>
		<!-- 必选配置 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/20171203hibernatetest</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">你的密码</property>
		<!-- 数据库方言 使用的数据库类型 -->
		<property name="hibernate.dialect org.hibernate.dialect.MySQLDialect"></property>
		<!-- 可选配置 -->
			<!-- 显示sql -->
		<property name="hibernate.show_sql">true</property>
			<!-- 格式化sql -->
		<property name="hibernate.format_sql">true</property>
			<!-- 配置c3p0连接池 -->
		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
			<!-- 最小连接数 -->
		<property name="hibernate.c3p0.min_size">5</property>
			<!-- 最大连接数 -->
		<property name="hibernate.c3p0.max_size">20</property>
			<!-- 最大空闲连接120秒 -->
		<property name="hibernate.c3p0.timeout">120</property>
			<!-- 自动建表 删除,创建,删除:creat-drop  创建:creat 如果没有表就创建,有就同步:update(一般使用) 验证类和数据表结构是否一致:validate-->
		<property name="hibernate.hbm2ddl.auto">update</property>
			<!-- 把session绑定到当前线程,使用getCurrentSession获取当前session -->
		<property name="hibernate.current_session_context_class">thread</property>
		<!-- 映射文件 -->
		<mapping resource="model/Role.hbm.xml"/>
		<mapping resource="model/User.hbm.xml"/>
	</session-factory>
</hibernate-configuration>
6、工具类HibernateUtils.java

package util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	//使用一个静态块创建SessionFactory
	private static Configuration CONFIG;
	private static SessionFactory FACTORY;
	
	static {
		CONFIG = new Configuration().configure();
		FACTORY = CONFIG.buildSessionFactory();
	}
	
	//从连接池中获取连接
	public static Session openSession() {
		return FACTORY.openSession();
	}
	
	//session绑定到线程
	public static Session getCurrentSession() {
		return FACTORY.getCurrentSession();
	}
}

7.测试类TestManyToMany.java

package test;

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

import model.Role;
import model.User;
import util.HibernateUtils;

public class TestManyToMany {
	@Test
	public void testsave() {
		//新建2个用户
		User u1 = new User();
		u1.setUser_name("罐罐");
		User u2 = new User();
		u2.setUser_name("波波");
		
		//新建2个角色
		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 session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		session.save(u1);
		session.save(u2);
		session.save(r1);
		session.save(r2);
		
		tr.commit();
		
	}
	
	@Test
	public void testsave1() {
		//新建2个用户
		User u1 = new User();
		u1.setUser_name("罐罐1");
		User u2 = new User();
		u2.setUser_name("波波1");
		
		//新建2个角色
		Role r1 = new Role();
		r1.setRole_name("演员1");
		Role r2 = new Role();
		r2.setRole_name("歌手1");
		
		//罐罐演员+歌手
		u1.getRoles().add(r1);
		u1.getRoles().add(r2);
		
		//波波演员
		u2.getRoles().add(r1);
		
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		session.save(u1);
		session.save(u2);
		session.save(r1);
		session.save(r2);
		
		tr.commit();
		
	}
	
	@Test
	public void testDelete() {
		//获取id为7的用户
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		User user = session.get(User.class,7L);
		
		//获取id为8的
		Role role = session.get(Role.class, 8L);
		
		//解除关系
		user.getRoles().remove(role);
		//使用快照机制
		tr.commit();
	}
	
	@Test
	public void testDelete1() {
		//获取id为7的用户
		Session session = HibernateUtils.getCurrentSession();
		Transaction tr = session.beginTransaction();
		
		User user = session.get(User.class,7L);
		session.delete(user);
		tr.commit();
	}
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值