在前文hibernate之5.many2one单向提到多对多关系,表结构设计是基于中间表来实现,

以下以用户与角色(多对多)为例,在Hibernate是怎样操作的

表结构设计:

类图:

CRUD;

Student

package com.demo.model;

import java.io.UnsupportedEncodingException;
import java.util.Set; /**学生信息
* @author wobendiankun
*2014-10-19 下午08:54:29
*/
public class Student {
private int studentId ;
private String studentName ;
private int age;
private Set<Certificate> certificates ;
private User user;
public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
String str="";
if(studentName!=null){
try {
str=new String(studentName.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return "Student [studentId=" + studentId + ", studentName="
+ str + ", age=" + age + "]";
}
public Set<Certificate> getCertificates() {
return certificates;
}
public void setCertificates(Set<Certificate> certificates) {
this.certificates = certificates;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
} }

Role

package com.demo.model;

import java.util.Set;

/**角色信息
* @author wobendiankun
*2014-11-2 下午08:29:54
*/
public class Role {
/**
* 角色id
*/
private int roleId;
/**
* 角色名称
*/
private String roleName; public Role() {
} public Role(int roleId) {
this.roleId = roleId;
} public Role(String roleName) {
this.roleName = roleName;
} private Set<User> users;
public int getRoleId() {
return roleId;
}
public void setRoleId(int roleId) {
this.roleId = roleId;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
} }

配置:

Role.hbm.xml

<?

xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping > <class name="com.demo.model.Role" table="t_role">
<id name="roleId" column="role_id">
<generator class="sequence">
<param name="sequence">SEQ_T_ROLE</param>
</generator>
</id>
<property name="roleName" column="role_name" />
<set name="users" table="t_user_role" lazy="extra">
<key column="role_id"></key>
<many-to-many class="com.demo.model.User" column="user_id"></many-to-many>
</set>
</class>
</hibernate-mapping>

<set name="users" table="t_user_role" lazy="extra">

<key column="role_id"></key>

<many-to-many class="com.demo.model.User" column="user_id"></many-to-many>

</set>

set元素的table属性::指中间表名

key元素的column属性:指表t_role在中间表中的关联字段

many-to-many元素的class属性:指set中的元素类型  ,column:User实体映射表t_user在中间表的关联字段

add:

</pre><pre name="code" class="java">@Test
<span style="white-space:pre"> </span>public void addTest() {
<span style="white-space:pre"> </span>User user1=new User("李三","111");
<span style="white-space:pre"> </span>User user2=new User("李四","111");
<span style="white-space:pre"> </span>Set<User> users=new HashSet<User>();
<span style="white-space:pre"> </span>users.add(user1);
<span style="white-space:pre"> </span>users.add(user2);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>Role role=new Role("开发组");
<span style="white-space:pre"> </span>role.setUsers(users);
<span style="white-space:pre"> </span>Session session = null;
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>session = HibernateUtil.openSession();
<span style="white-space:pre"> </span>session.beginTransaction();
<span style="white-space:pre"> </span>session.save(user1);
<span style="white-space:pre"> </span>session.save(user2);
<span style="white-space:pre"> </span>session.save(role);
<span style="white-space:pre"> </span>session.getTransaction().commit();
<span style="white-space:pre"> </span>} catch (Exception e) {
<span style="white-space:pre"> </span>session.getTransaction().rollback();
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>} finally {
<span style="white-space:pre"> </span>HibernateUtil.closeSession(session);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}

发出sql:

Hibernate: insert into t_user (user_name, password, student_id, user_id) values (?, ?

, ?, ?)
Hibernate: insert into t_user (user_name, password, student_id, user_id) values (?, ?, ? , ? )
Hibernate: insert into t_role (role_name, role_id) values (?, ?)
Hibernate: insert into t_user_role (role_id, user_id) values (?, ? )
Hibernate: insert into t_user_role (role_id, user_id) values (?, ?)

load

@Test
public void loadTest(){
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();
Role role=(Role)session.load(Role.class,2);
System.out.println("角色名称"+role.getRoleName());
System.out.println("users:"+role.getUsers());
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
e.printStackTrace();
} finally {
HibernateUtil.closeSession(session);
}
}

发出sql:

Hibernate: select role0_.role_id as role1_3_0_, role0_.role_name as role2_3_0_ from t_role role0_ where role0_.role_id=?
角色名称开发组
Hibernate: select users0_.role_id as role1_3_1_, users0_.user_id as user2_1_, user1_.user_id as user1_2_0_, user1_.user_name as user2_2_0_, user1_.password as password2_0_, user1_.student_id as student4_2_0_ from t_user_role users0_ inner join t_user user1_ on users0_.user_id=user1_.user_id where users0_.role_id=?
users:[com.demo.model.User@b4be3d, com.demo.model.User@35bb0f]

hibernate它 10.many2many单向的更多相关文章

  1. hibernate一对一外键单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  2. hibernate一对一主键单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  3. Hibernate的关联映射——单向1-N关联

    Hibernate的关联映射--单向1-N关联 单向1-N关联的持久化类里需要使用集合属性.因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现.从这个意义上来看,1-N(实际上还包括N ...

  4. Hibernate的关联映射——单向1-1关联

    Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...

  5. Hibernate的关联映射——单向N-1关联

    Hibernate的关联映射--单向N-1关联 N-1是非常常见的关联关系,最常见的父子关系也是N-1关联,单向的N-1关联只需从N的一端可以访问1的一端. 为了让两个持久化类能够支持这种关联映射,程 ...

  6. hibernate之关于一对一单向,双向关联映射

    [hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...

  7. 【SSH进阶之路】Hibernate映射——多对一单向关联映射(四)

    [SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,採用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例 ...

  8. hibernate它5.many2one单向

    关系数据库表之间的关系: 1 正确 1 1 正确 许多 许多 正确 许多 表间关系设计 基于主键关联 基于外键关联 基于中间表 1 对 1关系实现: 基于主键关联 基于外键关联 基于中间表 1 对 多 ...

  9. 【SSH系列】Hibernate映射-- 多对一单向关联映射

    在hibernate中非常重要的就是映射,在前面的博文中,小编简单的介绍了基本映射,基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型 ...

随机推荐

  1. uva 10003 Cutting Sticks(区间DP)

    题目连接:10003 - Cutting Sticks 题目大意:给出一个长l的木棍, 再给出n个要求切割的点,每次切割的代价是当前木棍的长度, 现在要求输出最小代价. 解题思路:区间DP, 每次查找 ...

  2. CSS实现输入框的高亮效果-------Day50

    又到周末了,这一天天过的真快,明天应该回老家了.不知道会不会有机会进行编写.尽量争取吧,实在不想就这样间断.假设说从前会一天天无聊到爆,那如今自己应该是一天天忙的要死,欠缺了太多东西,那些浪费的时间可 ...

  3. Python的TkinterButton做为父窗口

    #-*-coding:utf--*- import Tkinter,time,tkMessageBox,sys,BeBigModule class MainFrame: def __init__(se ...

  4. VS2010添加默认路径,库以及Lib

    下面以OpenCV为例,不需要每次打开VS2010都手动添加OpenCV的库和lib,具体方法如下: VC++目录 步骤一:用任意文本编辑器打开:  VS安装目录中的\VC\VCWizards\def ...

  5. 重构ConditionHelper

    在上一篇日志写了ConditionHelper的具体实现方法和它的用法,但那时只是把心里所想的一个思路用代码记录下来,而没有经过实践检 验的,难免存在一些问题,但在最近的一个新项目中用到Conditi ...

  6. 忘记root密码时如何重设密码

    哈哈,太久没用linux了,把自己的登陆密码给忘了.今天找了下方法如何重设密码以登陆系统. 此文仅以作备忘. 忘记linux密码时,可以使用单用户模式进入linux,修改root密码.1.在linux ...

  7. Java文件压缩分割(待)

    http://blog.csdn.net/ycg01/article/details/1366648

  8. vmware无法链接U盘:vm-->removeable devices.

    vmware无法链接U盘:vm-->removeable devices.

  9. 在mysql数据库中关于日期时间字段的处理

    在mysql数据库中关于日期时间字段的处理 在开发中,日期时间字段一般有如下几种设计 假设要获取2013-08-15日到2013-08-16日之间的记录 1. 直接使用日期时间类字段 相关sql语句如 ...

  10. linux网络编程学习笔记之三 -----多进程并发服务端

    首先是fork()函数.移步APUE 8.3.  比較清晰的解释能够參考http://blog.csdn.net/lingdxuyan/article/details/4993883和http://w ...