使用Hibernate映射多对多关联关系时,是否需要创建关联对象的总结

最近在做一个CMS管理项目,在RBAC模型创建时,遇到一个小疑问。

我们知道使用Hibernate可以使用many-to-many的注解或xml配置来自动完成多对多映射,例如:User Role Group三个对象,以User和Group为例。

在数据库表中必然存在一个t_user_group的table表,使用Hibernate完全可以在不建立UserGroup对象的情况就完成级联添加、删除、查询等操作。

目前来看,我们在实体模型中是没有必要创建UserGroup这个关联对象的。

但是如果遇到下面一种情况:项目Service层中频繁的需要User和Group两个对象一起查询使用,那么这时候UserGroup这个对象看起来又像是有必要建立了。

分析到这一步,只许对比这种情况下两种方法向数据库发送的语句条数就可以基本分析出需不需要建立UserGroup对象了。

先看不使用UserGroup时:

String hql = "select u,gs from User u left join u.groups gs where u.id>? and gs.id>?";

Query query = sessionFactory.getCurrentSession().createQuery(hql);

query.setParameter(0, 4);

query.setParameter(1, 1);

List<Object[]> gs =  query.list();

for(Object[] object:gs){

User u = (User)object[0];

Group g = (Group)object[1];

System.out.println(u.getUsername()+"---"+g.getName());

}

以下是控制台输出的sql语句,只有一条,并且可以

Hibernate: select user0_.id as id1_0_, group2_.id as id0_1_, user0_.email as email1_0_, user0_.password as password1_0_, user0_.username as username1_0_, group2_.description as descript2_0_1_, group2_.name as name0_1_ from t_user user0_ left outer join t_group_user
groups1_ on user0_.id=groups1_.uid left outer join t_group group2_ on groups1_.gid=group2_.id where user0_.id>? and group2_.id>?

结果:

niuba---group3

niuba---group2

wujiu---group2

zhaoqi---group3

zhangsan1111---group3

zhangsan1111---group2

所以没必要在做UserGroup的另一个测试了,因为最少也需要一条语句。

结论:即使需要经常将User和Group一起成对的使用,也没必要建立UserGroup关联对象。只需在UserDao方法中实现相应的方法,然后返回一个List集合(集合的内容为一个Object的数据——Object[ ]),然后在Object[ ]中将User和Group一一取出即可。

时间: 2024-11-09 06:24:58

使用Hibernate映射多对多关联关系时,是否需要创建关联对象的总结的相关文章

Hibernate映射多对多双向关联关系(小案例)

多对多双向关联关系(Project(工程)/Emp(员工)为案例): 步骤如下: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 private Integer pid; //名称 private String pname; //定义集合类型的Emp属性 private Set<Emp> emps=new HashSet<Emp>(); public Integer getPid() { return pid; }

JPA学习笔记(7)——映射多对一关联关系

多对一关联关系 两个实体类,User和Order,一个User可以有多个Order,一个Order只能有一个User 建立关联关系 使用@ManyToOne注解映射多对一关联关系 User实体类 package com.jpa.helloworld; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.pers

hibernate映射-双向n-n关联关系

(学习记录,错误不足之处,请您耐心指正^_^) hibernate映射-双向n-n关联关系 一.代码示例: {类文件↓} Category.class package com.zit.hibernate.n2n.both; import java.util.HashSet; import java.util.Set; public class Category { private Integer id; private String name; private Set<Item> items

(九)Hibernate的多对多关联关系

一.概述 多对多关联关系在java对象中可以通过定义集合类型来实现关联关系. 在关系数据模型中,无法直接表达表和表之间的多对多关联关系,而是需要创建一个中间表包含了两边的主键,来表达两张表的多对多关联关系. 实例:我们用一个Student和Course(学生和课程)的例子来演示多对多关联关系. (1)创建Student和Course类 public class Student { private Integer id; private String name; //用一个集合包含该学生所选的课程

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

[SSH进阶之路]Hibernate基本原理(一) ,小编介绍了Hibernate的基本原理以及它的核心,采用对象化的思维操作关系型数据库. [SSH进阶之路]Hibernate搭建开发环境+简单实例(二),小编搭建了基本Hibernate的开发环境,并做了一个简单实例,对它的基本原理有了一个理性的认识. [SSH进阶之路]Hibernate基本映射(三),我们介绍了Hibernate的基本映射(即对一个实体进行映射)的相关概念,并给大家实现相关实例,比较简单. 这篇博客,我们开始介绍基于基本映

【SSH系列】Hibernate映射 -- 多对多关联映射

     映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张表中做一个关联,用第三张表来解决可能造成的数据冗余问题.今天这篇博文小编来简单的介绍一下hibernate中的多对多关联映射. 在某些系统中,一个用户可以有多个角色,一个角色也可以有多个用户,so,她们之间的关系就是多对多,多对多关联

【SSH进阶之路】Hibernate映射——多对多关联映射(八)

上篇博文[SSH进阶之路]Hibernate映射--一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数据冗余的问题. 举例 一个用户(User)对多个角色(Role),一个角色对多个用户. 分类 单向的多对多关联映射(单向User--->Role) 对象模型 关系模型 实例

hibernate映射实体类查询时数据库空字段赋值给实体类报错的问题

因为一直报实体类空异常,去网上查了资料只查到了并没有查到数据库空值时不给实体类赋值的属性,只有这两个属性 这两个属性时设置 实体类有空字段插入或更新 数据库时空属性为默认值 异常 org.hibernate.InvalidMappingException: Could not parse mapping document from resource cn/pojo/EmpDao.xml at org.hibernate.cfg.Configuration.addResource(Configur

Hibernate注解多对一关联关系

实体类1 package entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; @Entity publ