`

hibernate 映射-一对多双向

阅读更多

项目名称:shop_goods

使用spring ,hibernate,struts2,分别的版本如下:

spring :3.2.3.RELEASE

hibernate:4.2.2.Final

struts2:2.3.4.1

使用xml配置,使用maven构建。

这里涉及两个实体类:商品,超市。因为要讲解一对多的关系映射,所以假设商品和超市之间是多对一联系。

一个超市有多个商品,一个商品只属于一个超市。

实体类代码如下(省略setter,getter方法)

 

package com.shop.jn.entity;

import java.io.Serializable;
import java.sql.Date;

/**
 * entity:goods  商品
 * @author huangwei
 *
 */
public class Goods  implements Serializable{
	private static final long serialVersionUID = 586940311263079808L;
	private int id;
	/**
	 * goods name
	 */
	private String name;
	/**
	 * alias of goods
	 */
	private String alias;
	/**
	 * when goods was brought
	 */
	private java.util.Date buyDateTime;
	/**
	 * when this record was modified
	 */
	private Date latestModDateTime;
	/**
	 * the price of goods
	 */
	private double price;
	/**
	 * the detail of the goods
	 */
	private String description;
	/**
	 * the supermarket the goods belong
	 */
	private Supermarket supermarket;
}

package com.shop.jn.entity;

import java.io.Serializable;
import java.util.List;
/**
 * entity:shop   超市
 * @author huangwei
 *
 */
public class Supermarket  implements Serializable{

	private static final long serialVersionUID = 6517742699077464699L;
	private int id;
	/**
	 * the name of the shop
	 */
	private String name;
	private String description;
	private List<Goods> goods;
	/**
	 * the sum of goods 
	 */
	private int goodsAmount;
	}

 hibernate配置文件如下

 

Goods.hbm.xml(多的一方):

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
    <class name="com.shop.jn.entity.Goods" table="t_goods" lazy="true">
        <!--<cache usage="read-write"/>
        --><id name="id" type="int">
            <column name="ID" precision="19" scale="0">
                <comment>主键id</comment>
            </column>
            <generator class="identity"/>
        </id>
         <property name="name">
            <column name="name">
                <comment>商品的名称</comment>
            </column>
        </property>
       
        <property name="alias"  >
            <column name="alias">
            
                <comment>商品的别名</comment>
            </column>
        </property>
       
        <property name="buyDateTime">
            <column name="buyDateTime" >
                <comment>购买时间</comment>
            </column>
        </property>
        <property name="latestModDateTime">
            <column name="latestModDateTime">
                <comment>最后修改时间</comment>
            </column>
        </property>
        <property name="price">
            <column name="price">
                <comment>商品价格</comment>
            </column>
        </property>
        <property name="description">
            <column name="description">
                <comment>商品的具体信息</comment>
            </column>
        </property>
        <!-- fetch=FetchType.EAGER is equal lazy=false -->
       <many-to-one name="supermarket" class="com.shop.jn.entity.Supermarket" lazy="false" cascade="all" insert="true" update="true" >
            <column name="supermarketId"  >
                <comment>商店</comment>
            </column>
            
        </many-to-one>
      
    </class>
</hibernate-mapping>

 Supermarket.hbm.xml(一的一方):

 

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
	<class name="com.shop.jn.entity.Supermarket" table="t_supermarket"
		lazy="true">
		<!--<cache usage="read-write"/> -->
		<id name="id" type="int">
			<column name="ID"><!-- precision="19" scale="0" -->
				<comment>主键id</comment>
			</column>
			<generator class="identity" />
		</id>
		<property name="name">
			<column name="name">
				<comment>商店的名称</comment>
			</column>
		</property>
		<!--<property name="goodsAmount"> <formula>(select count(*) from t_goods 
			g where g.supermarketId=id)</formula> </property> -->
		<property name="description">
			<column name="description">
				<comment>商店的详细信息</comment>
			</column>
		</property>
		<bag name="goods" lazy="false" fetch="subselect" inverse="true">
			<key column="supermarketId"></key>
			<one-to-many class="com.shop.jn.entity.Goods" />
		</bag>


	</class>
</hibernate-mapping>

 主要对bag标签进行详细的说明

 

bag标签中有如下属性

lazy(可选--默认为 true)可以用来关闭延迟加载(false)

如果指定lazy为false,则在查询supermarket(一的一方)时会把supermarket中的goods(多的一方)也查询出来,查询的的策略有三种:subselect,select,join

这里使用的策略是fetch属性指定的subselect,执行的SQL语句如下:

 

Hibernate: 
    /* criteria query */ select
        this_.ID as ID1_1_0_,
        this_.name as name2_1_0_,
        this_.description as descript3_1_0_ 
    from
        t_supermarket this_
Hibernate: 
    /* load one-to-many com.shop.jn.entity.Supermarket.goods */ select
        goods0_.supermarketId as supermar8_1_1_,
        goods0_.ID as ID1_0_1_,
        goods0_.ID as ID1_0_0_,
        goods0_.name as name2_0_0_,
        goods0_.alias as alias3_0_0_,
        goods0_.buyDateTime as buyDateT4_0_0_,
        goods0_.latestModDateTime as latestMo5_0_0_,
        goods0_.price as price6_0_0_,
        goods0_.description as descript7_0_0_,
        goods0_.supermarketId as supermar8_0_0_ 
    from
        t_goods goods0_ 
    where
        goods0_.supermarketId=?

 

如果我设置lazy为true呢?

 

调用supermarket.getGoods().size()时就会报错:

 

10:31:14,097  WARN  - Caught an exception while evaluating expression '0==goods.size' against value stack
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.shop.jn.entity.Supermarket.goods, could not initialize proxy - no Session

 因为使用的是懒加载,查询supermarket时没有把goods查询出来。

 

 

inverse(可选 — 默认为 false)标记这个集合作为双向关联关系中的方向一端。因为这里是双向关联,所以设置inverse为true

0
5
分享到:
评论

相关推荐

    Hibernate ORM - 一对多双向关联关系

    标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...

    Hibernate ORM - 一对多双向连接表关联关系

    虽然描述部分为空,但根据标题,我们可以推断这篇文章可能详细介绍了如何在Hibernate中设置和管理一对多双向关联,包括配置XML映射文件、注解或者使用Java配置,以及如何在代码中处理这种关联关系。 **标签解析:**...

    Hibernate ORM - 一对多双向组合关联关系

    这个标题表明我们要讨论的是Hibernate ORM框架中的一种特定的数据关系映射——一对多双向组合关联。在关系型数据库中,一对多关联意味着一个父实体可以与多个子实体相对应,而双向则表示这种关系是相互的,即父实体...

    Hibernate ORM - 多对多双向连接表关联关系

    本文将深入探讨Hibernate ORM中的一个关键概念——多对多双向连接表关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生等例子,都需要用到多对多的关系来描述它们之间的复杂联系。 首先...

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    Hibernate 一对一唯一外键关联映射详解 Hibernate是一种流行的Java持久层框架,提供了多种关联映射方式,其中一对一唯一外键关联映射是一种常见的关联方式。在本文中,我们将详细介绍Hibernate一对一唯一外键关联...

    Hibernate ORM - 多对多双向中间实体关联关系

    本文将深入探讨Hibernate ORM中的一个关键概念:多对多双向中间实体关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生之间的关联等。 首先,多对多关联意味着两个实体类之间存在多个...

    hibernate one-to-many 单/双向关联映射配置心得

    本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...

    Hibernate one-to-many / many-to-one关系映射

    在Hibernate的hbm.xml文件中,一对一关系通过&lt;one-to-one&gt;标签,一对多关系通过、、或标签来定义。需要详细指定实体类名、主键列名以及关联的外键列名。 2. 注解配置: 在实体类上直接使用@OneToOne、@OneToMany等...

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

    hibernate5--3.映射关系

    本文将深入探讨Hibernate5中的映射关系,主要包括多对多(Many-to-Many)和一对多(One-to-Many)这两种关系。 一、多对多映射(Many-to-Many) 多对多关系在数据库中表现为两个表之间存在多个连接记录,而在对象...

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

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    Hibernate ORM - 一对一主键关联关系

    - **双向关联**:在一对一关联中,通常会定义双向关系,即双方都可以访问对方。但并非必须,也可以只在一方定义关联。 - **外键约束**:在一对一关联中,如果不使用共享主键,可以创建外键约束,但这样就不再是...

    hibernate关联映射详解

    包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。

    hibernate对映射xml的一对多的双向关联详解

    本篇文章将深入探讨 Hibernate 中的一对多双向关联映射。 在数据库设计中,一对多关联是指一个实体可以与多个其他实体相关联,比如一个学生可以有多个课程,一个部门可以有多名员工。在Hibernate中,这种关系可以...

    Hibernate双向一对多经典实例

    **标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...

    hibernate学习5之one-to-many双向关联.docx

    在Hibernate框架中,双向一对多关联映射是常见的对象关系映射(ORM)方式,用于在Java对象模型中表示数据库中的两个实体之间的多对一关系。在这个场景中,"一"端通常指的是一个实体可以拥有多个另一个实体的实例,而...

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

    在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...

Global site tag (gtag.js) - Google Analytics