单向:
情况:
一个用户拥有多个角色,一个角色可以包含多个用户。单用户可看到角色,角色看不到用户
原理:
只有一端可以看到另一端,而另一端则看不到
关系图:
具体实现
1、实体
<span style="font-size:18px;"> user:
/**
* 定义用户实体
* @author gxq
*
*/
public class User {
private int id;
private String name;
private Set roles;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getRoles() {
return roles;
}
public void setRoles(Set roles) {
this.roles = roles;
}
}
role:
package com.bjpowernode.hibernate;
/**
* 定义角色实体
* @author gxq
*
*/
public class Role {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}</span>
2、映射文件
<span style="font-size:18px;"> User.hbm.xml:
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="user_id"></key>
<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Role.hbm.xml:
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping></span>
3、配置文件
<span style="font-size:18px;"> <hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">
<![CDATA[jdbc:mysql://localhost:3306/Hibernate?useUnicode=true&characterEncoding=utf8]]>
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<!--
<property name="hibernate.format_sql">true</property>
-->
<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
<mapping resource="com/bjpowernode/hibernate/Role.hbm.xml"/>
</session-factory>
</hibernate-configuration></span>
4、封装好的工具类:HibernateUtils
<span style="font-size:18px;"> /**
* 工具类(封装开启session和事务)
* @classname HibernateUtils
* @author 高晓青
* @date 2015-4-16 下午2:56:42
* @version hibernate
*/
public class HibernateUtils {
private static SessionFactory factory;
static{
try {
//默认读取的是hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
//建立sessionFactory
factory = cfg.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
//开启session
public static Session getSession(){
return factory.openSession();
}
//关闭session
public static void closeSession(Session session){
//判断是否为空
if(session!=null){
//判断是否是打开状态再进行关闭
if(session.isOpen()){
session.close();
}
}
}
}</span>
5、添加
public void testSaveManyToMany1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
// 定义经理角色并赋值
Role managerRole = new Role();
managerRole.setName("商务经理");
session.save(managerRole);
// 定义主管角色并赋值
Role directorRole = new Role();
directorRole.setName("商务主管");
session.save(directorRole);
// 定义职员角色并赋值
Role clerkRole = new Role();
clerkRole.setName("录入人员");
session.save(clerkRole);
// 设置管理员,并为其赋予橘色
User admin = new User();
admin.setName("张三");
Set<Role> managerSet = new HashSet<Role>();
managerSet.add(managerRole);
managerSet.add(directorRole);
managerSet.add(clerkRole);
admin.setRoles(managerSet);
session.save(admin);
// 设置一般用户,并为其赋予角色
User commonUser = new User();
commonUser.setName("李四");
Set<Role> commonSet = new HashSet<Role>();
commonSet.add(directorRole);
commonSet.add(clerkRole);
commonUser.setRoles(commonSet);
session.save(commonUser);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
}
}
6、查询
<span style="font-size:18px;"> /**
* 根据用户查角色
*/
public void testLoad1(){
Session session=null;
try {
//获得Session,并开启事务
session=HibernateUtils.getSession();
session.beginTransaction();
//根据用户ID为9查询
User user=(User)session.load(User.class,9);
System.out.println(user.getName());
//遍历该用户下的角色
for(Iterator iter=user.getRoles().iterator(); iter.hasNext();){
Role role=(Role)iter.next();
System.out.println(role.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
</span>
多向:
情况:
一个用户拥有多个角色,一个角色可以包含多个用户。
原理:
将不能看见另一端作为集合放在的可看到一端
关系图
具体实现
1、实体
<span style="font-size:18px;">User:
/**
* 定义用户实体
* @author gxq
*
*/
public class User {
private int id;
private String name;
private Set roles;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public Set getRoles() {
return roles;
public void setRoles(Set roles) {
this.roles = roles;
}
}
Role:
/**
* 定义角色实体
* @author gxq
*
*/
public class Role {
private int id;
private String name;
private Set users;
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}</strong></span>
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}</span>
2、映射文件
User.hbm.xml:
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="user_id"></key>
<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Role.hbm.xml:
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="users" table="t_user_role">
<key column="role_id"></key>
<many-to-many class="com.bjpowernode.hibernate.User" column="user_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
3、配置文件、工具类、添加:与单向一致
4、查询
数据库数据
<span style="font-size:18px;">/**
* 根据角色查用户
*/
public void testLoadMany2Many(){
Session session = null;
try {
//获得Session,并开启事务
session = HibernateUtils.getSession();
session.beginTransaction();
//根据角色ID为1查询
Role role = (Role)session.load(Role.class, 1);
System.out.println(role.getName());
//遍历该角色下的用户
for (Iterator<User> iter=role.getUsers().iterator(); iter.hasNext();) {
User user = (User)iter.next();
System.out.println(user.getName());
}
/*提交事务*/
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
//事务回滚
session.getTransaction().rollback();
}finally {
//关闭session
HibernateUtils.closeSession(session);
}
}</span>
结果: