一、创建表
CREATE TABLE sys_user ( user_id bigint IDENTITY(1,1) NOT NULL PRIMARY Key, user_code varchar(32) NULL, user_name varchar(64) NULL, user_password varchar(32) NULL , user_state char(1) NULL ) CREATE TABLE sys_role ( role_id bigint IDENTITY(1,1) NOT NULL PRIMARY Key, role_name varchar(32) NULL, role_memo varchar(128) DEFAULT NULL ) CREATE TABLE sys_user_role ( role_id bigint NOT NULL, user_id bigint NOT NULL, PRIMARY KEY (role_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 )
二、创建持久化类
①、实体类
public class User { private Long user_id; private String user_code; private String user_name; private String user_password; private String user_state; // 设置多对多关系:表示一个用户选择多个角色? // 放置的是角色的集合 private Set<Role> roles = new HashSet<Role>(); } public class Role { private Long role_id; private String role_name; private String role_memo; // 一个角色被多个用户选择: // 放置的是用户的集合 private Set<User> users = new HashSet<User>(); }
②、映射文件
User映射文件
<?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.hibernate.demo.User" table="sys_user"> <!-- 建立OID与主键的映射 --> <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"/> <!-- 建立与角色的多对多的映射关系 --> <!-- set标签 * name :对方的集合的属性名称。private Set<Role> roles = new HashSet<Role>(); * table :多对多的关系需要使用中间表,放的是中间表的名称。 --> <set name="roles" table="sys_user_role" cascade="save-update,delete" > <!-- key标签: * column :当前的对象对应中间表的外键的名称。 --> <key column="user_id"/> <!-- many-to-many标签: * class :对方的类的全路径 * column :对方的对象在中间表中的外键的名称。 --> <many-to-many class="com.hibernate.demo.Role" column="role_id"/> </set> </class> </hibernate-mapping>
Role映射文件
<?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.hibernate.demo.Role" table="sys_role"> <!-- 建立OID与主键的映射 --> <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"/> <!-- 与用户的多对多的映射关系 --> <!-- set标签 * name :对方的集合的属性名称。 * table :多对多的关系需要使用中间表,放的是中间表的名称。 --> <set name="users" table="sys_user_role" cascade="save-update,delete" inverse="true"> <!-- key标签: * column :当前的对象对应中间表的外键的名称。 --> <key column="role_id"/> <!-- many-to-many标签: * class :对方的类的全路径 * column :对方的对象在中间表中的外键的名称。 --> <many-to-many class="com.hibernate.demo.User" column="user_id"/> </set> </class> </hibernate-mapping>
③、核心文件
<mapping resource="com/hibernate/demo/User.hbm.xml"/> <mapping resource="com/hibernate/demo/Role.hbm.xml"/>
④、Java测试代码
@Test public void demo5() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); User user1=new User(); user1.setUser_name("zhangsan"); User user2=new User(); user2.setUser_name("lisi"); Role role1=new Role(); role1.setRole_name("admin"); Role role2=new Role(); role2.setRole_name("guests"); Role role3=new Role(); role3.setRole_name("Employee"); // 双向关联 user1.getRoles().add(role1); user1.getRoles().add(role3); user2.getRoles().add(role2); role1.getUsers().add(user1); role2.getUsers().add(user1); role3.getUsers().add(user2); session.save(user1); session.save(user2); session.save(role1); session.save(role2); session.save(role3); transaction.commit(); }
三、多对多的其他操作
①、赋值用户角色
public void demo5() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); User user=session.get(User.class, 1l); Role role=session.get(Role.class, 3l); user.getRoles().add(role); transaction.commit(); }
②、改选用户角色
@Test public void demo5() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); User user=session.get(User.class, 2l); Role role3=session.get(Role.class, 3l); Role role1=session.get(Role.class, 1l); user.getRoles().remove(role3); user.getRoles().add(role1); transaction.commit(); }
③、删除用户角色
@Test public void demo5() { Session session = HibernateUtils.getCurrentSession(); Transaction transaction = session.beginTransaction(); User user=session.get(User.class, 1l); Role role2=session.get(Role.class, 2l); user.getRoles().remove(role2); transaction.commit(); }