项目名称: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
相关推荐
标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...
虽然描述部分为空,但根据标题,我们可以推断这篇文章可能详细介绍了如何在Hibernate中设置和管理一对多双向关联,包括配置XML映射文件、注解或者使用Java配置,以及如何在代码中处理这种关联关系。 **标签解析:**...
这个标题表明我们要讨论的是Hibernate ORM框架中的一种特定的数据关系映射——一对多双向组合关联。在关系型数据库中,一对多关联意味着一个父实体可以与多个子实体相对应,而双向则表示这种关系是相互的,即父实体...
本文将深入探讨Hibernate ORM中的一个关键概念——多对多双向连接表关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生等例子,都需要用到多对多的关系来描述它们之间的复杂联系。 首先...
Hibernate 一对一唯一外键关联映射详解 Hibernate是一种流行的Java持久层框架,提供了多种关联映射方式,其中一对一唯一外键关联映射是一种常见的关联方式。在本文中,我们将详细介绍Hibernate一对一唯一外键关联...
本文将深入探讨Hibernate ORM中的一个关键概念:多对多双向中间实体关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生之间的关联等。 首先,多对多关联意味着两个实体类之间存在多个...
本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...
在Hibernate的hbm.xml文件中,一对一关系通过<one-to-one>标签,一对多关系通过、、或标签来定义。需要详细指定实体类名、主键列名以及关联的外键列名。 2. 注解配置: 在实体类上直接使用@OneToOne、@OneToMany等...
标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...
本文将深入探讨Hibernate5中的映射关系,主要包括多对多(Many-to-Many)和一对多(One-to-Many)这两种关系。 一、多对多映射(Many-to-Many) 多对多关系在数据库中表现为两个表之间存在多个连接记录,而在对象...
本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...
- **双向关联**:在一对一关联中,通常会定义双向关系,即双方都可以访问对方。但并非必须,也可以只在一方定义关联。 - **外键约束**:在一对一关联中,如果不使用共享主键,可以创建外键约束,但这样就不再是...
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
本篇文章将深入探讨 Hibernate 中的一对多双向关联映射。 在数据库设计中,一对多关联是指一个实体可以与多个其他实体相关联,比如一个学生可以有多个课程,一个部门可以有多名员工。在Hibernate中,这种关系可以...
**标题:“Hibernate双向一对多经典实例”** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用面向对象的方式处理数据。本实例将聚焦于Hibernate中的一对多关系...
在Hibernate框架中,双向一对多关联映射是常见的对象关系映射(ORM)方式,用于在Java对象模型中表示数据库中的两个实体之间的多对一关系。在这个场景中,"一"端通常指的是一个实体可以拥有多个另一个实体的实例,而...
在Java的持久化框架Hibernate中,双向一对多关联映射是一种常见的关系映射方式,它模拟了数据库中的外键关联,使得一个实体可以拥有多个另一个实体的实例。在这个注解版的实现中,我们将深入探讨如何使用Hibernate的...