多对多关联
在hibernate的关联映射当中,多对多的关联映射需要借助中间表完成。由于多对多关联的性能不佳(由于引入中间表,一次读取操作需要反复数次查询),因此设计中应该避免大量使用。
一个例子:角色Role与权限privilege的关系是典型的一对多关系,现有一个军团,一个军团里有团长,将军,军师和士兵这几个角色,在一个军团里,团长拥有全部权限,可以任命手下,发起团战,发起讨伐Boss和日常个人训练,将军和军师除了没有任命权限,其他的都有,而士兵只有日常个人训练这一权限。。。
TRole.java
package learnHibernate.bean; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class TRole implements Serializable{ private static final long serialVersionUID = -2404169291623739243L; private int id; private String name; private Set<TPrivilege> privileges = new HashSet<TPrivilege>(); 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<TPrivilege> getPrivileges() { return privileges; } public void setPrivileges(Set<TPrivilege> privileges) { this.privileges = privileges; } }
TRole.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="learnHibernate.bean"> <class name="TRole" table="t_role"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="name" column="name" type="java.lang.String"/> <set name="privileges" table="t_role_privilege" lazy="false" cascade="save-update"> <key column="rid"/> <many-to-many class="TPrivilege" column="pid"/> </set> </class> </hibernate-mapping>
TPrivilege.java
package learnHibernate.bean; import java.io.Serializable; import java.util.HashSet; import java.util.Set; public class TPrivilege implements Serializable{ private static final long serialVersionUID = -5315523735464709855L; private int id; private String name; private Set<TRole> roles = new HashSet<TRole>(); 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<TRole> getRoles() { return roles; } public void setRoles(Set<TRole> roles) { this.roles = roles; } }
TPrivilege.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="learnHibernate.bean"> <class name="TPrivilege" table="t_privilege"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="name" column="name" type="java.lang.String"/> <set name="roles" table="t_role_privilege" lazy="false" inverse="true" cascade="save-update"> <key column="pid"/> <many-to-many class="TRole" column="rid"/> </set> </class> </hibernate-mapping>
注意映射文件中,cascade设置为“save-update”,是因为对于多对多的逻辑而言,很少出现删除一方需要级联删除所有关联数据的情况,如删除一个“团长”角色,不会删除其包含的所有权限,同样,删除一个权限,不会删除与之关联的所有角色。
多对多的两方不能都是主控方,也就是说,要在其中的一个映射配置中设置inverse为true。没有主控方也不行,因为那样hibernate不会插中间表。
执行代码:
TRole r1 = new TRole(); r1.setName("Regimental commander"); TRole r2 = new TRole(); r2.setName("General"); TRole r3 = new TRole(); r3.setName("Military adviser"); TRole r4 = new TRole(); r4.setName("Private"); TPrivilege p1 = new TPrivilege(); p1.setName("Assignment"); TPrivilege p2 = new TPrivilege(); p2.setName("Expedition"); TPrivilege p3 = new TPrivilege(); p3.setName("Trainning"); r1.getPrivileges().add(p1); r1.getPrivileges().add(p2); r1.getPrivileges().add(p3); r2.getPrivileges().add(p2); r2.getPrivileges().add(p3); r3.getPrivileges().add(p2); r3.getPrivileges().add(p3); r4.getPrivileges().add(p3); p1.getRoles().add(r1); p2.getRoles().add(r1); p2.getRoles().add(r2); p2.getRoles().add(r3); p3.getRoles().add(r1); p3.getRoles().add(r2); p3.getRoles().add(r3); p3.getRoles().add(r4); SessionFactory factory = HibernateLocalUtil.getSessionFactory(); Session session = factory.openSession(); Transaction tx = session.beginTransaction(); //多对多关联必须同时对关联双方进行保存 session.save(r1); session.save(r2); session.save(r3); session.save(r4); session.save(p1); session.save(p2); session.save(p3); tx.commit(); session.close();
输出sql:
Hibernate: insert into t_role (name) values (?) Hibernate: insert into t_privilege (name) values (?) Hibernate: insert into t_role (name) values (?) Hibernate: insert into t_privilege (name) values (?) Hibernate: insert into t_role (name) values (?) Hibernate: insert into t_role (name) values (?) Hibernate: insert into t_privilege (name) values (?)
相关推荐
**Hibernate使用——入门** Hibernate 是一个强大的开源对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互。这篇博文将引导你入门Hibernate,理解其基本概念和使用方法。 **1. Hibernate概述** ...
本教程将深入探讨如何使用Hibernate来实现一个简单的课程管理系统,涵盖多对多关联映射以及CRUD操作。 ### Hibernate概述 Hibernate是一个开源的ORM框架,它允许开发者使用Java对象来表示数据库中的记录,从而避免...
这个标题表明我们要讨论的是Hibernate ORM框架中的一种特定的数据关系映射——一对多双向组合关联。在关系型数据库中,一对多关联意味着一个父实体可以与多个子实体相对应,而双向则表示这种关系是相互的,即父实体...
本教程主要聚焦于Hibernate中的一个关键概念——关系映射,特别是多对一单向关联的实现。这种关联类型常出现在数据库设计中,比如一个部门可以有多名员工,但一个员工只属于一个部门。 首先,我们要理解多对一关系...
6. **关联映射**:JPA允许定义实体之间的关联,如一对一(@OneToOne),一对多(@OneToMany),多对一(@ManyToOne)和多对多(@ManyToMany)。这些关联可以通过属性或集合进行映射。 7. **懒加载和即时加载**:...
在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射,特别是“一对一”双向外键关联。这种关联类型在数据库设计中很常见,尤其是在处理具有紧密耦合的实体时。Hibernate作为Java中广泛使用的对象关系...
在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射,特别是“一对一双向主键关联”。这种关联类型是数据库设计中的常见模式,它允许两个实体类之间通过共享相同的主键来建立关联。在Java应用中,...
在使用Hibernate框架处理实体间多对多关系时,经常会遇到一个棘手的问题——如何有效地管理中间关联表(如`role_popedom`),特别是在执行删除和更新操作时。本文将基于一个具体的示例场景,深入探讨这一问题,并...
6. **实体类**:表示数据库表的Java类,它们通过Hibernate注解或XML映射文件与数据库表进行关联。 7. **数据库表**:如`users`表,存储用户注册信息。 通过这个项目,开发者可以学习到如何整合Struts和Hibernate,...
在`java组件——hibernate.ppt`和`HibernatePractice`中,可能会包含关于如何在实际项目中设置这些映射和继承策略的示例。例如,如何配置 XML 映射文件(hbm.xml)或使用注解进行映射,以及如何在代码中操作这些关联...
通过Hibernate,可以编写HQL(Hibernate Query Language)或者使用Criteria API来查询用户信息。同时,Hibernate还处理了数据的持久化,如保存、更新和删除用户信息。 **4. 用户登录流程** - 用户填写用户名和密码...
总结来说,Hibernate的双向一对一关联映射涉及两个实体类之间的相互引用,需要在每个实体类上使用`@OneToOne`注解,并通过`mappedBy`指定关联的方向。此外,主键共享是通过`@PrimaryKeyJoinColumn`注解实现的。理解...
- **Hibernate教程**: 包括第一部分——第一个Hibernate应用程序,第二部分——映射关联,第三部分——EventManager Web应用程序。每部分都提供了详细的步骤和代码示例,让开发者能够通过实践来学习Hibernate的使用...
Hibernate支持多种关系映射,如一对一(`@OneToOne`)、一对多(`@OneToMany`)、多对一(`@ManyToOne`)和多对多(`@ManyToMany`)。每种关系映射都有相应的配置方法。 11. **懒加载(Lazy Loading)** 通过`@...
Hibernate 支持多种关系映射,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。通过这些注解,你可以定义实体之间的关联关系。 10. **实用工具** Hibernate 提供了...
5. 支持关联映射:一对多、一对一、多对多等各种关联关系的映射。 6. 插件扩展:例如,Hibernate Search允许对数据库进行全文搜索。 六、最佳实践 - 避免在循环中使用Session,以免引发内存泄漏。 - 使用...
5. 对多种数据库的支持:Hibernate可以轻松地与Oracle、MySQL、PostgreSQL等多种数据库配合使用。 6. 可扩展性:允许开发者通过插件机制自定义行为,如实体监听器、类型转换器等。 7. 性能优化:包括更有效的缓存...
- **单向关联与连接表**:介绍如何使用连接表来映射一对多和多对一关系。 - **双向关联**:探讨双向关联的实现方法,包括一对多和多对一关系。 - **双向关联与连接表**:说明如何使用连接表来实现双向关联。 #### ...
在这个“hibernate压缩包”中,包含的两个项目——HibCustomerProject和HibCustomerOrders,很可能是两个示例应用,用于展示Hibernate在实际开发中的使用。 首先,我们来看看HibCustomerProject。这个项目可能是一...