- 浏览: 113727 次
- 性别:
- 来自: 福建
文章分类
最新评论
-
wenbing2610:
其实用Struts实现图片上传比用Servlet实现容易多了。 ...
Struts2文件上传深入FileUploadInterceptor -
i_feng:
public class uploadImageAction ...
Struts2文件上传深入FileUploadInterceptor -
wenbing2610:
...
ognl.MethodFailedException
多对多其实是个很复杂的关系,hibernate在进行处理的时候借助中间表或者中间类。中间表是在映射文件的关联标签(比如集合标签<set>)中由table属性指定的由hibernate自动生成的表,它只有两个字段,分别由<key>和<many-to-many>标签的table属性指定,作为外键分别用来指向关联双方表的主键。中间类就是把我们的中间表抽象生成一个实体类,在映射的时候分别和两个关联类构成一对多的关系,即演变成两个一对多来处理。
以下用中间表的例子来说明单向多对多关系映射:运动员(player)与角色(role)就是典型的多对多关系。
首先创建player,role类分别对应的表格:sxt_hibernate_player,sxt_hibernate_role,和中间表sxt_hibernate_player_role(在MySQL环境中)代码如下:
create table sxt_hibernate_player(
id int(11) not null auto_increatement,
name varchar(16),
primary key(id)
)ENGINE=InnoDB DEFAULT CHARSET=gbk;
create table sxt_hibernate_role(
id int(11) not null auto_increatement,
name varchar(16),
primary key(id)
)ENGINE=InnoDB DEFAULT CHARSET=gbk;
create table sxt_hibernate_player_role(
player_id int(11),
role_id int(11)
)ENGINE=InnoDB DEFAULT CHARSET=gbk;
Player实体类:
public class Player {
private Integer id;
private String name;
private Set<Role> roles;
//...省去一系列的setter.getter方法
@Override
public String toString() {
return "Player:" + name;
}
}
Role实体类:
public class Role {
private Integer id;
private String name;
//...省去一系列的setter.getter方法
@Override
public String toString() {
return "Role:" + name;
}
}
映射文件:
Role.hbm.xml
<class name="com.sxt.hibernate.many2many.entity.Role" table="sxt_hibernate_role">
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="name" length="10"></property>
</class>
Player.hbm.xml
<class name="com.sxt.hibernate.many2many.entity.Player" table="sxt_hibernate_player">
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="name" length="10"></property>
<!--table="sxt_hibernate_user_role"含义,用来指定中间表 -->
<set name="roles" table="sxt_hibernate_player_role" cascade="save-update">
<!--<key column="user_id">含义,指定中间表中用来指向本表的外键 -->
<key column="player_id"></key>
<!-- column含义,用来指定中间表中用来指向另一端表的外键 -->
<many-to-many class="com.sxt.hibernate.many2many.entity.Role" column="role_id"></many-to-many>
</set>
</class>
测试类Test:
public class Test{
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 测试插入数据
*/
Role role1=new Role();
role1.setName("后卫");
Role role2=new Role();
role2.setName("前锋");
Role role3=new Role();
role3.setName("中锋");
Player player1=new Player();
player1.setName("姚明");
Set<Role> roles1=new HashSet<Role>();
roles1.add(role3);
player1.setRoles(roles1);
Player player2=new Player();
player2.setName("詹姆斯");
Set<Role> roles2=new HashSet<Role>();
roles2.add(role1);
roles2.add(role2);
roles2.add(role3);
player2.setRoles(roles2);
//能正确保存.每保存player后,都要级联保存它的role,并且级联插入中间表记录.
session.save(player1);
session.save(player2);*/
/**
* 测试加载数据
*/
Player player=(Player)session.load(Player.class, 1);
System.out.println(player);
for(Iterator<Role> iterator=player.getRoles().iterator();iterator.hasNext();){
System.out.println(iterator.next());
}
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
以下用中间表的例子来说明单向多对多关系映射:运动员(player)与角色(role)就是典型的多对多关系。
首先创建player,role类分别对应的表格:sxt_hibernate_player,sxt_hibernate_role,和中间表sxt_hibernate_player_role(在MySQL环境中)代码如下:
create table sxt_hibernate_player(
id int(11) not null auto_increatement,
name varchar(16),
primary key(id)
)ENGINE=InnoDB DEFAULT CHARSET=gbk;
create table sxt_hibernate_role(
id int(11) not null auto_increatement,
name varchar(16),
primary key(id)
)ENGINE=InnoDB DEFAULT CHARSET=gbk;
create table sxt_hibernate_player_role(
player_id int(11),
role_id int(11)
)ENGINE=InnoDB DEFAULT CHARSET=gbk;
Player实体类:
public class Player {
private Integer id;
private String name;
private Set<Role> roles;
//...省去一系列的setter.getter方法
@Override
public String toString() {
return "Player:" + name;
}
}
Role实体类:
public class Role {
private Integer id;
private String name;
//...省去一系列的setter.getter方法
@Override
public String toString() {
return "Role:" + name;
}
}
映射文件:
Role.hbm.xml
<class name="com.sxt.hibernate.many2many.entity.Role" table="sxt_hibernate_role">
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="name" length="10"></property>
</class>
Player.hbm.xml
<class name="com.sxt.hibernate.many2many.entity.Player" table="sxt_hibernate_player">
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="name" length="10"></property>
<!--table="sxt_hibernate_user_role"含义,用来指定中间表 -->
<set name="roles" table="sxt_hibernate_player_role" cascade="save-update">
<!--<key column="user_id">含义,指定中间表中用来指向本表的外键 -->
<key column="player_id"></key>
<!-- column含义,用来指定中间表中用来指向另一端表的外键 -->
<many-to-many class="com.sxt.hibernate.many2many.entity.Role" column="role_id"></many-to-many>
</set>
</class>
测试类Test:
public class Test{
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 测试插入数据
*/
Role role1=new Role();
role1.setName("后卫");
Role role2=new Role();
role2.setName("前锋");
Role role3=new Role();
role3.setName("中锋");
Player player1=new Player();
player1.setName("姚明");
Set<Role> roles1=new HashSet<Role>();
roles1.add(role3);
player1.setRoles(roles1);
Player player2=new Player();
player2.setName("詹姆斯");
Set<Role> roles2=new HashSet<Role>();
roles2.add(role1);
roles2.add(role2);
roles2.add(role3);
player2.setRoles(roles2);
//能正确保存.每保存player后,都要级联保存它的role,并且级联插入中间表记录.
session.save(player1);
session.save(player2);*/
/**
* 测试加载数据
*/
Player player=(Player)session.load(Player.class, 1);
System.out.println(player);
for(Iterator<Role> iterator=player.getRoles().iterator();iterator.hasNext();){
System.out.println(iterator.next());
}
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
}
发表评论
-
CSS样式表的overflow属性
2015-01-02 19:22 28一、滚动条样式overflow ... -
jrebel运用
2014-07-13 22:00 1145JRebel热部署 ... -
JPA执行原生SQL截断Char类型问题
2014-05-24 21:39 1142在JPA的API中执行原生 ... -
JPA基本数据类型映射
2014-05-24 21:06 3846/** ... -
spring定时器配置
2014-03-18 21:36 661创建测试类: ... -
The Struts dispatcher cannot be found
2013-11-03 18:48 614运行环境:struts2环境中访 ... -
JasperException
2013-09-15 20:41 986JasperException异常: ... -
equal symbol expected
2013-09-15 20:08 1144equal symbol ... -
Hibernate主键生成器
2013-09-12 21:11 761... -
Criterion和Criteria
2013-09-08 16:00 1862Hibernate Criter ... -
getHibernateTemplate用法
2013-09-08 15:02 541HibernateTemplate提供的方法 ... -
JS中页面跳转
2013-09-08 14:01 618<html><head><t ... -
GridPanel详解
2013-03-10 10:45 9971、Ext.grid.GridPanel ... -
tomcat内存溢出
2013-03-04 20:26 690在使用Java程序从数据库中查询大量的数据或 ... -
History Object
2013-01-07 21:06 714history 对象是window 对象的另一个子 ... -
Write to programmer
2012-12-29 20:16 807很多的java初级程序员对自己没有一个明确的方 ... -
EL语言
2012-09-27 22:08 852EL的前世今生: ... -
JSTL标签的使用
2012-09-27 22:00 756JSP 标准标记库( Standard Tag Library ... -
使用IBATIS防止sql注入
2012-08-26 21:17 1538对于ibaits参数引用可以使用#和$两 ... -
IBATIS动态SQL标签用法
2012-08-26 21:04 11461、动态SQL片段通过SQL片 ...
相关推荐
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ...
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
简单的Hibernate的N对N关系的映射,这里主要的只是谈到了关于如何映射一对一,多对一,多对多的单向和双向映射。 当然,其实所谓的单双向映射最终还是要表现在select时的作用,但是这一部分并未介绍。 我想,要想搞...
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
多对多单向关联 <br>需要注意映射规则: <set name="users" table="t_user_role"><br> <key column="roleid"/><br> <many-to-many class="com.bjsxt.hibernate.User" column="userid"/><br> </set>
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
映射单向多对一、单向一对多、双向一对一、双向多对一和双向多对多关联关系的具体实现
流利的NHibernate自动映射实现单向多对多关系
hibernate各种映射关系祥解 一对一双向 一对一单向 一对多双向 一对多单向 多对一单向 多对多双向 多对多单向
实现Hibernate框架中一对一,一对多,多对多关系的单向和双向配置总结!
单向一对一 双向一对一 单向一对多 双向一对多 双向多对一 单向多对多 双向多对多
Hibernate高级映射的几个单向关系,单向一对一(共享主键方式、唯一外键方式),单向多对一,单向一对多,单向多对多。
在文献[5]提出单向S-模糊集的基础上,给出映射单向S-粗模糊集概念,映射诱导的等价关系的概念;讨论了映射单向S-粗模糊集的性质。得出单向S-粗模糊集是映射单向S-粗模糊集的特例,映射单向S-粗模糊集是粗集理论的一...
hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向
http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
Hibernate 实体关联关系映射 学习总结 把一对一 一对多 单向 双向 主键 外键 链接表等讲的比较清楚
JSP开发之hibernate之单向多对一关联的实例 一对多的基础上来测试单向多对一的...:单向多对一,简单很多在多的一方定义一的一方类的实例,在映射文件中: 持久化类 column=外键的类名> Java代码: Grade g=ne
多对多双向关联 <br>注意映射规则: <set name="roles" table="t_user_role"><br> <key column="userid"/><br> <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/><br> </set><br> table...