`
conkeyn
  • 浏览: 1512027 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Hibernate中多对多关系映射、保存、查询

阅读更多

首先是一些基础模型类的建立:

 

import java.io.Serializable;

public abstract class BaseObject implements Serializable {

	/**  */
	private static final long serialVersionUID = -7443978018690354629L;

	@Override
	public abstract String toString();

	@Override
	public abstract boolean equals(Object o);

	@Override
	public abstract int hashCode();

}
 
public abstract class DefaultIdGeneral extends BaseObject {

	/**  */
	private static final long serialVersionUID = -7483768110342207606L;

	// ID
	protected Long id;

	// 版本号,用于Hibernate乐观锁
	protected Integer version;

	/**
	 * 
	 * hibernate.id column="id" generator-class="native"
	 * 
	 * @return Returns the id.
	 */
	public abstract Long getId();

	/**
	 * @param id
	 *            The id to set.
	 */
	public abstract void setId(Long id);

	/**
	 * 
	 * @hibernate.version
	 * 
	 * @return Returns the version.
	 */
	public Integer getVersion() {
		return version;
	}

	/**
	 * @param version
	 *            The version to set.
	 */
	public void setVersion(Integer version) {
		this.version = version;
	}
}
 

1、多对多关系映射(房间表与设备进行多对多关系映射),两者之间的关系映射时必需有一端的inverse=true,另一端为false,不能两端的inverse都为true。不然在保存或删除两者间的关系时不会对中间表进行操作。

    1)房间表

import java.util.Set;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;

/**
 * title: 建筑中的房间
 * 
 * @author Administrator
 * @时间 2009-9-22:下午03:41:43
 * @hibernate.class table="fc_roombasic" dynamic-update="true"
 *                  dynamic-insert="true"
 */
public class MapRoom extends DefaultIdGeneral {

	/**  */
	private static final long serialVersionUID = -3216302518592517083L;

	/** 房间名称 room_name */
	private String name;

	/** 房间内设备 */
	private Set<Equipment> equipments;

	/**
	 * @hibernate.id column="room_id" generator-class="native"
	 * 
	 */
	@Override
	public Long getId() {
		return id;
	}

	@Override
	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * @hibernate.property column="room_name"
	 * 
	 */
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @hibernate.set table="fc_room_equipment" lazy="true" cascade="all"
	 *                inverse="true"
	 * @hibernate.collection-many-to-many column="equipment_id"
	 *                                    class="com.yinhoo.map.model.Equipment"
	 * @hibernate.collection-key column="room_id"
	 * @return
	 */
	public Set<Equipment> getEquipments() {
		return equipments;
	}

	public void setEquipments(Set<Equipment> equipments) {
		this.equipments = equipments;
	}

	@Override
	public boolean equals(final Object other) {
          ...
	}

	@Override
	public int hashCode() {
          ....
	}

	@Override
	public String toString() {
          .........
	}

}

 2)设备

import java.util.Set;

/**
 * title: 设备信息
 * 
 * @author Administrator
 * @时间 2009-9-22:下午09:49:32
 * @hibernate.class table="fc_equip" dynamic-update="true" dynamic-insert="true"
 */
public class Equipment extends DefaultIdGeneral {

	/** 设备名称 */
	private String name;

	/** 使用房间(对应roombasic表room_id) */
	private Set<MapRoom> rooms;

	/**
	 * @hibernate.id column="equip_id" generator-class="native"
	 * 
	 */
	@Override
	public Long getId() {
		return id;
	}

	@Override
	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * @hibernate.property column="equip_name"
	 * 
	 */
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	/**
	 * @hibernate.set table="fc_room_equipment" lazy="true" cascade="all"
	 *                inverse="false"
	 * @hibernate.collection-many-to-many column="room_id"
	 *                                    class="com.yinhoo.map.model.MapRoom"
	 * @hibernate.collection-key column="equipment_id"
	 * @return
	 */
	public Set<MapRoom> getRooms() {
		return rooms;
	}

	public void setRooms(Set<MapRoom> rooms) {
		this.rooms = rooms;
	}

}

2、多对多之间的查询。

public int getMapRoomTotalRecord(Equipment equipment) {
		String sql = "select count(room.id) from MapRoom as room where room.equipments.id="
				+ equipment.getId() + " ";
		// System.out.println(sql);
		return ((Long) getSession().createQuery(sql).uniqueResult())
				.intValue();
	}
 
String sql = "select count(room.id) from MapRoom as room join room.equipments as equip where equip.id="
				+ equipment.getId() + " ";
 
public int getMapRoomTotalRecord(Equipment equipment) {
		String sql = "select count(room.id) from MapRoom as room join room.equipments as equip where equip= :equipment";
		// System.out.println(sql);
		return ((Long) getSession().createQuery(sql).setParameter("equipment",
				equipment).uniqueResult()).intValue();
	}

  查询结果集:

public List<MapRoom> getMapRooms(Equipment equipment,
			int first, int max) {
		String sql = "select room from MapRoom as room join room.equipments as equip where equip= :equipment ";
		return getSession().createQuery(sql).setParameter("equipment",
				equipment).setFirstResult(first).setMaxResults(max).list();
	}
 

 

下面是参照http://www.blogjava.net/fuhoujun/archive/2009/01/06/232230.html


一个老师教许多学生,一个学生被许多老师教,一个学生有好多书,同一种书被许多同学拥有.
要查询教拥有书"a"的学生的老师!

Hql语句:

SELECT t FROM Teacher t join t.students s join s.books b where b.name = 'a' 
 

 

解释:t.students s中s并不是集合的意思,而是t的students对象的表别名,join t.students s这个hql,hibernate会翻译成两个表的内连接关系

错误写法:

SELECT t FROM teacher t where t.students.books.name = 'a' 
 

 

其实道理是很显然的,t.students是一个Set,那么这个Set怎么可能有books这样的属性呢?同理books.name也不对,所以 使用表间连接并给出别名t.students s,此时的对象s才有books属性,所以可以写s.books b,最后使用b.name限制查询b.name = 'a'. 

另外一种写法:

SELECT t FROM Teacher t,Student s,Book b where s.id in elements(t.students) and b.id in elements(s.books) 
 


这种方法没有出错!不过这种方式要用子查询!

分享到:
评论
1 楼 javaxhw 2011-01-14  
你的保存呢

相关推荐

    hibernate(多对多关系映射)

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系映射是一种常见的数据库交互模式,它用于表示两个实体之间复杂的关系。在这个场景中,一个实体可以与多个其他实体相关联,反之亦然。例如,在学生和课程...

    hibernate 单向多对多关联映射练习

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑层解耦,提高开发效率。本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计...

    Hibernate使用 Map实现多对多映射

    在Java的持久化框架Hibernate中,多对多映射是一种常见的关系映射方式,用于处理两个实体类之间一对多或多对一的关系。在这个例子中,我们看到的是`Team`(团队)与`Member`(成员)之间的多对多关系,通过`Map`数据...

    hibernate(一对多,多对一映射)操作

    在Java的持久化框架中,Hibernate是一个非常重要的工具,它为开发者提供了强大的对象关系映射(ORM)功能,使得在Java应用中操作数据库变得更加简单。本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一...

    hibernate学习入门一对多实体映射源码

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的方式,从而简化了数据访问层的编程。在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将...

    Hibernate 多表映射关系配置

    对多关系在 Hibernate 中,多对多关系通常涉及到一个中间表来存储两个实体之间的关联。以下是如何配置 Hibernate 的多对多映射关系。 1. 数据库建表 假设我们有两张表,`users` 和 `roles`,它们通过 `user_roles` ...

    Hibernate教程20_关系映射案例三

    【标题】"Hibernate教程20_关系映射案例三"主要涵盖了在Hibernate框架中如何进行对象关系映射(ORM)的实践,特别是针对复杂关系的处理。在这个教程中,我们可能会学习到以下关键知识点: 1. **关系映射**:...

    hibernate单向多对多映射(注解版)

    在Java的持久化框架Hibernate中,单向多对多映射是一种常见的关系映射方式,尤其在处理数据库中两个实体间复杂关联时显得尤为重要。在注解版的Hibernate中,我们不再需要传统的XML配置文件,而是直接在实体类上使用...

    Hibernate一对多,多对一映射

    总的来说,Hibernate的一对多和多对一映射是实现对象关系映射的重要手段,它们简化了数据库操作,提高了代码的可读性和可维护性。理解并熟练运用这些映射关系,对于开发高效、稳定的Java企业级应用至关重要。在实践...

    Hibernate教程05_关系映射之一对一双向外键关联

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射,特别是“一对一”双向外键关联。这种关联类型在数据库设计中很常见,尤其是在处理具有紧密耦合的实体时。Hibernate作为Java中广泛使用的对象关系...

    Hibernate中的关系映射

    本篇将详细介绍在Hibernate中三种常见的关系映射:单向映射(多对一、一对一)。 1. 多对一映射: 这种关系表示在一个实体(如`StudentEntity`)中有一个引用指向另一个实体(如`GroupEntity`),即一个学生可以...

    Hibernate双向一对一关联映射(注解版)

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的方式,从而提高开发效率。本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的...

    Hibernate集合映射与关联关系

    在IT行业中,数据库管理和对象关系映射(ORM)框架是至关重要的部分,特别是对于Java开发者而言,Hibernate是一个广泛使用的ORM工具。本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合...

    Hibernate教程09_关系映射之组件映射

    在本教程中,我们将深入探讨Hibernate中的一个关键概念——关系映射中的组件映射。Hibernate作为Java领域中广泛使用的对象关系映射(ORM)框架,它允许开发人员以面向对象的方式处理数据库操作,极大地简化了数据层...

    hibernate多对一、一对一、一对多、多对多映射的理解(经典)

    多对一关联映射的本质是将关联关系映射到数据库中,所谓的关联关系是对象模型在内存中的一个或多个引用。&lt;many-to-one&gt; 元素会在多的一端加入一个外键,指向一的一端,这个外键是由 `&lt;many-to-one&gt;` 中的 `column` ...

    hibernate的关系映射

    **二、Hibernate关系映射的类型** 1. **一对一(OneToOne)**: 表示一个实体对应另一个实体的唯一实例。这可以通过在两个类中都定义`@OneToOne`注解来实现,并通过`mappedBy`属性指定被引用的一方。 2. **一对多...

    hibernate关联关系映射

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的方式,从而简化了数据访问层的编程。"hibernate关联关系映射"是Hibernate的核心概念之一,它定义了如何...

    Hibernate多对多映射

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)映射是一种常见的关系数据库模型,用于处理两个实体之间复杂的关系。本实例将详细阐述如何在Hibernate中实现多对多映射,并通过源代码和测试程序进行实战演示...

    Hibernate一对多主键关联映射源代码

    在Java的持久化框架Hibernate中,一对多关系(OneToMany)是一种常见的对象关系映射(ORM)映射方式,它模拟了数据库中一个表的一条记录与另一表的多条记录之间的关联。本教程通过源代码的形式,讲解如何在Hibernate...

    Hibernate多对多的映射

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作与业务逻辑代码解耦,提高开发效率。本篇主要探讨的是Hibernate中的多对多映射,这是一个复杂但常见的数据库关系,适用...

Global site tag (gtag.js) - Google Analytics