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