本文共 5156 字,大约阅读时间需要 17 分钟。
开发步骤:
用户表
CREATE TABLEsys_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=1 DEFAULT CHARSET=utf8; 角色表 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=1 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; 用户的实体
public class User { private Long user_id; private String user_code; private String user_name; private String user_password; private String user_state;private Setroles = new HashSet ();
角色的实体
public class Role { private Long role_id; private String role_name; private String role_memo;private Setusers = new HashSet ();
1.3.1.3创建映射
用户的映射《class name=“com.yidongxueyuan.mapping.User” table=“sys_user”> 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”/>
角色的映射
class name=“com.yidongxueyuan.mapping.Role” table=“sys_role”> id
name=“role_id” column=“role_id”> generator class=“native”/> property name=“role_name” column=“role_name”/> property name=“role_memo” column=“role_memo”/>
/*
测试多对多:
*/ public class HibernateManyToMany {@Test
public void test01() { Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction();//创建一个2个用户: User user1 = new User(); user1.setUser_name("毕老师"); User user2 = new User(); user2.setUser_name("张老师"); //创建三个角色: Role role1= new Role(); role1.setRole_name("市场部"); Role role2= new Role(); role2.setRole_name("研发部"); Role role3= new Role(); role3.setRole_name("人资部"); //设置双向关联关系: user1.getRoles().add(role1);// 1 2 角色: user1.getRoles().add(role2);// 1 2 角色: user2.getRoles().add(role2);// 2 3 Juese user2.getRoles().add(role3);// 2 3 Juese role1.getUsers().add(user1); role2.getUsers().add(user1); role2.getUsers().add(user2); role3.getUsers().add(user2); //保存操作: /* * 问题:如果设置了双向维护: 两个表都有权利维护第三种表: 会出现主键冲突问题: * org.hibernate.exception.ConstraintViolationException: * could not execute statement * * 解决: 必须一方放弃外键的维护: * 通常设置被动方放弃一方放弃维护外键。 被选择的一方: ;role * 在role当中的配置文件当中: inverse="true" */ session.save(user1); session.save(user2); session.save(role1); session.save(role2); session.save(role3); tx.commit();
}
}只保存一边是否可以
/* * 测试: 值保存一方是否可以? * 经过测试: 不可以, 同样的会抛出一个异常。 * 一个持久对象关联了一个瞬时对象。 * 解决: 设置级联操作: */ @Test public void test02() { Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction();User user1 = new User(); user1.setUser_name("毕老师"); Role role1= new Role(); role1.setRole_name("市场部"); //设置双向关联关系: user1.getRoles().add(role1);// 1 2 角色: role1.getUsers().add(user1); session.save(user1);
// session.save(role1);
tx.commit(); } 1.3.2.2多对多的级联保存或更新 保存用户级联保存角色保存角色级联保存用户
1.3.2.3多对多的级联删除(基本用不上)
删除用户级联删除角色删除角色级联删除用户
1.3.2.4多对多的其他的操作
给用户选择角色给用户改选角色
给用户删除角色
还是放一个多对多的例子吧233333333333333
package com.yidongxueyuan.test;import org.hibernate.Session;import org.hibernate.Transaction;import com.yidongxueyuan.mapping.Role;import com.yidongxueyuan.mapping.User;import com.yidongxueyuan.utils.HibernateUtils;public class HibernateManyToMany { public static void main(String[] args) { //保存操作: Session session = HibernateUtils.getCurrentSession(); Transaction tx = session.beginTransaction(); //准备数据: 用户数据: User user = new User(); user.setUser_name("bi1"); User user2 = new User(); user2.setUser_name("he2"); //准备角色数据: Role role1= new Role(); role1.setRole_name("普通用户"); Role role2= new Role(); role2.setRole_name("会员用户"); Role role3= new Role(); role3.setRole_name("管理员"); //建立双方之间的关系: user.getRoles().add(role1); user.getRoles().add(role2); user2.getRoles().add(role2); user2.getRoles().add(role3); role1.getUsers().add(user); role2.getUsers().add(user); role2.getUsers().add(user2); role3.getUsers().add(user2); //保存: session.save(user); session.save(user2); session.save(role1); session.save(role2); session.save(role3); //运行结果: Duplicate entry '1-1' for key 'PRIMARY' 出现了异常: //原因: user 和 role 都维护了映射表: //解决: 是的一方放弃外键的维护全: /* * 被动方放弃外键维护: */ tx.commit(); }}
转载地址:http://zwqen.baihongyu.com/