多对多关联映射通常采用第三方表,这张表存储了他们之间的关联关系。
一、单向多对多关联映射:
用户和角色属于多对对关系,一个用户可以拥有多个角色,一个角色也可以属于多个用户。
public class User {
private int userid;
private String username;
private Set roles;
getter and setter..
}
public class Role {
private int roleid;
private String rolename;
getter & setter
}
User.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 package="com.wyx.hibernate">
<class name="User" table="t_User">
<id name="userid">
<generator class="native"/>
</id>
<property name="username"/>
<set name="roles" table="t_User_Role" cascade="all">
<key column="userid" />
<many-to-many class="Role" column="roleid"/>
</set>
</class>
</hibernate-mapping>
set标签中的name指的是user的关联关系字段,set代表了中间表,用table指定中间表的名字,用key 的column属性作为外键指向user表的userid,many-to-mang的column作为外键指向role表的roid,构成了复合主键(由userid和roleid构成的)。
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 package="com.wyx.hibernate">
<class name="Role" table="t_Role">
<id name="roleid">
<generator class="native"/>
</id>
<property name="rolename"/>
</class>
</hibernate-mapping>
测试一对多save,从user方存储:
public void testSave(){
Session session = HibernateUtils.getSession();
try {
session.beginTransaction();
Role role1 = new Role();
role1.setRolename("程序员");
//session.save(role1);
Role role2 = new Role();
role2.setRolename("架构师");
//session.save(role2);
Set roles = new HashSet<Role>();
roles.add(role1);
roles.add(role2);
User user =new User();
user.setUsername("冰吼");
user.setRoles(roles);
session.save(user);
session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
打印输出:
Hibernate: insert into t_User (username) values (?)
Hibernate: insert into t_Role (rolename) values (?)
Hibernate: insert into t_Role (rolename) values (?)
Hibernate: insert into t_User_Role (userid, roleid) values (?, ?)
Hibernate: insert into t_User_Role (userid, roleid) values (?, ?)
测试一对多load,从user一方存储:
public void testLoad(){
Session session = HibernateUtils.getSession();
try {
session.beginTransaction();
User user = (User)session.load(User.class, 1);
Set<Role> roles = user.getRoles();
System.out.println("user.username = " + user.getUsername());
for(Iterator<Role> iter = roles.iterator(); iter.hasNext();){
Role role = iter.next();
System.out.println("user.role.rolename = " + role.getRolename());
}
session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
打印输出:
Hibernate: select user0_.userid as userid1_0_, user0_.username as username1_0_ from t_User user0_ where user0_.userid=?
user.username = 冰吼
Hibernate: select roles0_.userid as userid1_, roles0_.roleid as roleid1_, role1_.roleid as roleid0_0_, role1_.rolename as rolename0_0_ from t_User_Role roles0_ left outer join t_Role role1_ on roles0_.roleid=role1_.roleid where roles0_.userid=?
user.role.rolename = 架构师
user.role.rolename = 程序员
二、双向多对多关联映射:
双向多对多关联映射与单向的基本一致,不同之处就是在双发都加入了set集合来保存关联关系,但是在存储字段的时候,最好指定根据一方来添加,两边都存储容易造成混乱,在其中的一方映射文件的set标签中加入inverse = "true",将控制权交给另一方处理。【inverse属性只能应用于一对多双向关联、多对多双向关联】
修改Role.java:
package com.wyx.hibernate;
import java.util.Set;
public class Role {
private int roleid;
private String rolename;
private Set users;
getter & setter...
}
修改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 package="com.wyx.hibernate">
<class name="Role" table="t_Role">
<id name="roleid">
<generator class="native"/>
</id>
<property name="rolename"/>
<set name="users" table="t_User_Role" inverse="true" cascade="all" order-by="userid">
<key column="roleid"/>
<many-to-many class="User" column="userid"/>
</set>
</class>
</hibernate-mapping>
/**
* save role casecad user
*/
public void testSave(){
Session session = HibernateUtils.getSession();
try {
session.beginTransaction();
User user1 =new User();
user1.setUsername("冰吼");
User user2 =new User();
user2.setUsername("蓝胖");
Set users = new HashSet<User>();
users.add(user1);
users.add(user2);
Role role = new Role();
role.setRolename("架构师");
role.setUsers(users);
session.save(role);
session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
加入了inserse = "true",就不能从Role端存入数据,用以上测试方法存数据,中间表是不能存入数据的,但是去掉inserse就可以,但为了防止出错,还是加inverse由指定固定一方控制添加比较好。
分享到:
相关推荐
在本篇关于“Hibernate3.2(六)多对一关联映射”的主题中,我们将深入探讨在Java Persistence API(JPA)框架下,如何利用Hibernate实现多对一的关联映射。Hibernate作为JPA的一个实现,是Java开发中常用的ORM...
总结来说,这个demo项目提供了一个学习和实践Struts1.2、Spring2.5和Hibernate3.2集成的平台,涵盖了MVC设计模式、依赖注入、面向切面编程和对象关系映射等多个关键概念。通过深入研究和修改这个项目,开发者能够...
1. 支持JPA:Hibernate 3.2增加了对JSR-220(即JPA 1.0)规范的支持,使得开发者可以选择使用标准的JPA API,也可以继续使用Hibernate的原生API。 2. 查询优化:引入了更高效的查询执行策略,包括延迟加载(Lazy ...
6. **一对多、多对一、一对一关联映射** - 通过@ManyToOne、@OneToMany、@OneToOne注解定义不同类型的关联关系,简化了数据间的关联操作。 7. **延迟加载(Lazy Loading)** - Hibernate支持属性和关联的懒加载,...
6. **关联映射**:支持一对一、一对多、多对一、多对多等多种关联关系的映射。 在使用这两个JAR文件时,开发者需要确保有相应的JDBC驱动以连接数据库,并配置Hibernate的配置文件(如hibernate.cfg.xml),定义...
通过对Hibernate 3.2源码的阅读和分析,开发者可以深入理解其内部机制,学习如何优化数据访问,如何处理复杂的关联关系,以及如何实现更高效的缓存策略。这对于提升Java企业级应用的开发能力具有极大的价值。
- **一对多映射**:处理实体间的多对一或多对多关系。 - **继承映射**:支持不同类型的继承关系映射到数据库。 #### 六、查询语言 - **HQL (Hibernate Query Language)**:面向对象的查询语言,类似于 SQL 但更...
11. **Association Mapping关联映射**:Hibernate支持一对一、一对多、多对一、多对多等各种关联映射,方便地处理复杂的对象关系。 12. **延迟加载Lazy Loading**:Hibernate的懒加载机制可以推迟到真正需要时才...
5. **关系映射(Relationship Mapping)**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)关系。理解这些关系的配置和使用是掌握Hibernate的关键。 6. **会话(Session...
9. **集合映射**:在实体类中,可以定义一对多、一对一、多对一、多对多的关系。Hibernate提供了丰富的集合类型(如List、Set、Map等)来映射这些关系。 10. **延迟加载(Lazy Loading)**:为了提高性能,...
11. **关联映射**:Hibernate 支持一对一、一对多、多对一和多对多的关系映射,通过注解或XML配置来定义实体之间的关联。 12. **延迟加载(Lazy Loading)**:为了优化性能,Hibernate 实现了延迟加载机制。默认...
Hibernate3.2_API 是一套针对该版本的API文档和指南,对理解并使用Hibernate 3.2提供了详细指导。 1. **对象关系映射(ORM)**:ORM是一种编程技术,它通过在对象和关系数据库之间创建映射,简化了数据访问。...
Hibernate 3.2增加了对Java Persistence API(JPA)的支持,使得开发者可以选择使用标准的JPA接口,增强了与其他JPA实现的互操作性。 通过深入学习Hibernate 3.2的源代码,开发者不仅可以了解其实现原理,还能在...
3. **实体映射**:讲解如何使用Hibernate的XML映射文件(.hbm.xml)或注解来定义Java类与数据库表之间的映射关系,包括字段映射、主键生成策略、关联映射(一对一、一对多、多对一、多对多)等。 4. **Session接口*...
9. **关联映射**:包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)等关系映射,以及懒加载和立即加载策略。 10. **类型系统和用户类型**:Hibernate支持多种内置类型...
Hibernate3.2是其一个重要版本,它带来了许多改进和新特性,包括性能优化、对JPA的支持以及更多的查询选项。 ### Hibernate3.2 API `hibernate3.2API`是指Hibernate 3.2版本的官方API文档。这个文档详细介绍了各种...
3. 集合映射:一对多、多对多关系的映射,如Set、List、Map等集合类型的处理。 4. 异步查询:通过Hibernate的FutureResult和Query.listAsync()实现异步数据检索。 5. 动态模型:无需预先定义实体类,可以动态构建...
《Hibernate3.2官方中文参考手册》详细阐述了这些功能的使用方法和最佳实践,包括实体映射、查询构造、缓存策略、性能调优等内容,是开发者学习和掌握Hibernate3.2不可或缺的工具。通过阅读此手册,不仅可以理解...
5. **关联映射**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等关系的映射,通过`@OneToOne`、`@OneToMany`等注解实现。 6. **事件监听**:Hibernate允许注册监听器...