Hibernate的一对多关联
1、相关数据表:
CREATE TABLE IF NOT EXISTS Province
(
Guid INT NOT NULL AUTO_INCREMENT,
Provincename VARCHAR(16) NOT NULL,
PRIMARY KEY (Guid)
) TYPE=InnoDB;
CREATE TABLE IF NOT EXISTS City
(
Guid INT NOT NULL AUTO_INCREMENT,
Cityname VARCHAR(32) NOT NULL,
ProvinceID INT NOT NULL,
PRIMARY KEY (Guid)
) TYPE=InnoDB;
ALTER TABLE City ADD CONSTRAINT CityRFProvince FOREIGN KEY (ProvinceID)
REFERENCES Province (Guid) ON DELETE CASCADE ON UPDATE RESTRICT;
以上是建立一个非常简单的数据表关系,省市关系
其中两个create之后的alter语句很重要,ADD CONSTRAINT CityRFProvince FOREIGN KEY (ProvinceID) REFERENCES Province (Guid)是指City表中ProvinceID属性是Province的属性构成的外键,ON DELETE CASCADE ON UPDATE RESTRICT是指在对Province表和City表删除和修改时会自动修改(实现触发器功能)。
Province表做为主控方,City表做为被控方,两者之间是双向的一对多关系。用Middlegen生成的Province.hbm.xml文件,修改后的内容如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.1
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class
name="com.xxx.hibernate.Province"
table="Province"
>
<meta attribute="class-description" inherit="false">
@hibernate.class
table="Province"
</meta>
<id
name="guid"
type="int"
column="Guid"
>
<meta attribute="field-description">
@hibernate.id
generator-class="native"
type="int"
column="Guid"
</meta>
<generator class="native" />
</id>
<property
name="provincename"
type="java.lang.String"
column="Provincename"
not-null="true"
length="16"
>
<meta attribute="field-description">
@hibernate.property
column="Provincename"
length="16"
not-null="true"
</meta>
</property>
<!-- Associations -->
<!-- bi-directional one-to-many association to City -->
<set
name="cities"
lazy="true"
inverse="true"
cascade="save-update"
>
<meta attribute="field-description">
@hibernate.set
lazy="true"
inverse="true"
cascade="save-update"
@hibernate.collection-key
column="ProvinceID"
@hibernate.collection-one-to-many
class="com.xxx.hibernate.City"
</meta>
<key>
<column name="ProvinceID" />
</key>
<one-to-many
class="com.xxx.hibernate.City"
/>
</set>
</class>
</hibernate-mapping>
省对市是“一对多”关系,所以要设置<set>
set节点有以下属性(摘自Hibernate文档):
(1) name 集合属性的名称
(2) table (可选——默认为属性的名称)这个集合表的名称(不能在一对多的关联关系中使用)
(3) schema (可选) 表的schema的名称, 他将覆盖在根元素中定义的schema
(4) lazy (可选——默认为false) lazy(可选--默认为false) 允许延迟加载(lazy initialization )(不能在数组中使用)
(5) inverse (可选——默认为false) 标记这个集合作为双向关联关系中的方向一端。
(6) cascade (可选——默认为none) 让操作级联到子实体
(7) sort(可选)指定集合的排序顺序, 其可以为自然的(natural)或者给定一个用来比较的类。
(8) order-by (可选, 仅用于jdk1.4) 指定表的字段(一个或几个)再加上asc或者desc(可选), 定义Map,Set和Bag的迭代顺序
(9) where (可选) 指定任意的SQL where条件, 该条件将在重新载入或者删除这个集合时使用(当集合中的数据仅仅是所有可用数据的一个子集时这个条件非常有用)
(10) outer-join(可选)指定这个集合,只要可能,应该通过外连接(outer join)取得。在每一个SQL语句中, 只能有一个集合可以被通过外连接抓取(译者注: 这里提到的SQL语句是取得集合所属类的数据的Select语句)
(11) batch-size (可选, 默认为1) 指定通过延迟加载取得集合实例的批处理块大小("batch size")。
(12) access(可选-默认为属性property):Hibernate取得属性值时使用的策略
由于在建立外键的时候就声明了ON DELETE CASCADE,所以在xml的配置文件中cascade声明为save-update。如果声明为all,那么在删除Province表的数据时,会无谓的多出一条删除City的delete语句出来,这将会影响程序的性能。
City.hbm.xml的内容如下:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
<hibernate-mapping>
<!--
Created by the Middlegen Hibernate plugin 2.1
http://boss.bekk.no/boss/middlegen/
http://www.hibernate.org/
-->
<class
name="com.xxx.hibernate.City"
table="City"
>
<meta attribute="class-description" inherit="false">
@hibernate.class
table="City"
</meta>
<id
name="guid"
type="int"
column="Guid"
>
<meta attribute="field-description">
@hibernate.id
generator-class="native"
type="int"
column="Guid"
</meta>
<generator class="native" />
</id>
<property
name="cityname"
type="java.lang.String"
column="Cityname"
not-null="true"
length="32"
>
<meta attribute="field-description">
@hibernate.property
column="Cityname"
length="32"
not-null="true"
</meta>
</property>
<!-- Associations -->
<!-- bi-directional many-to-one association to Province -->
<many-to-one
name="province"
class="com.xxx.hibernate.Province"
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
not-null="true"
>
<meta attribute="field-description">
@hibernate.many-to-one
cascade="none"
outer-join="auto"
update="true"
insert="true"
access="property"
not-null="true"
@hibernate.column name="ProvinceID"
</meta>
<column name="ProvinceID" />
</many-to-one>
</class>
</hibernate-mapping>
many-to-one节点有以下属性(摘自Hibernate文档):
(1) name: 属性名。
(2) column (可选): 字段名。
(3) class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。
(4) cascade(级联) (可选): 指明哪些操作会从父对象级联到关联的对象。
(5) outer-join(外连接) (可选 - 默认为 自动): 当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取。
(6) update, insert (可选 - defaults to true) 指定对应的字段是否在用于UPDATE 和/或 INSERT的SQL语句中包含。如果二者都是false,则这是一个纯粹的“外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到的,或者通过trigger(除法器),或者是其他程序。
(7) property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键。
(8) access (可选 - 默认是 property): Hibernate用来访问属性的策略。
cascade 属性允许下列值: all, save-update, delete, none。设置除了none以外的其它值会传播特定的操作到关联的(子)对象中。参见后面的“Lifecycle Objects(自动管理生命周期的对象)”。
outer-join参数允许下列三个不同值:
auto (默认) 使用外连接抓取关联(对象),如果被关联的对象没有代理(proxy)
true 一直使用外连接来抓取关联
false 永远不使用外连接来抓取关联
用hbm2java生成对应的对应的Java类:hbm2java *.xml --output=xxx。
Hibernate的配置文件hibernate.cfg.xml内容如下:
JUnit的测试用例程序片断如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- local connection properties -->
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/xxx?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- property name="hibernate.connection.pool_size"></property -->
<!-- dialect for MySQL -->
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.use_outer_join">true</property>
<property name="hibernate.transaction.factory_class">net.sf.hibernate.transaction.JDBCTransactionFactory</property>
<mapping resource="com/xxx/hibernate/City.hbm.xml"/>
<mapping resource="com/xxx/hibernate/Province.hbm.xml"/>
</session-factory>
</hibernate-configuration>
public void testInsert() {
try {
Province province = new Province();
province.setProvincename("广东");
City city = new City();
city.setCityname("深圳");
city.setProvince(province);
province.setCities(new HashSet());
province.getCities().add(city);
Transaction tx = session.beginTransaction();
session.save(province);
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
本文来自CSDN博客:http://blog.csdn.net/chengang9695183/archive/2007/11/01/1861322.aspx#
感谢CSDN的chengang9695183提供这么简明的例子!!!
分享到:
相关推荐
本文将深入探讨Hibernate中的一对多、多对一、一对一以及多对多四种关系映射的配置实例,帮助开发者更好地理解和运用这些关系。 ### 一对多关系(One-to-Many) 在数据库设计中,一对多关系是最常见的一种关联,...
在数据库设计中,实体之间的关系主要包括一对一、一对多、多对多等几种类型。而在ORM(对象关系映射)框架Hibernate中,通过不同的注解或者XML配置来表示这些关系。其中,`many-to-one`(多对一)关系是较为常见的一...
在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...
### Hibernate的多对一和一对多操作实例:深入解析与应用 #### 1. 多对一和一对多概念解析 在关系型数据库设计中,多对一和一对多是两种非常基础且重要的关联关系类型。多对一指的是多个实体(如订单)与一个实体...
标题中的“hibernate一对多实例”指的是在Java编程中使用Hibernate框架处理数据库关系时的一对多关联映射。Hibernate是Java领域中的一个流行对象关系映射(ORM)框架,它允许开发者用面向对象的方式操作数据库,从而...
在Hibernate的配置文件中,可以使用`<one-to-one>`标签来定义一对一关系,如下: ```xml <one-to-one name="profile" class="Profile" cascade="all"/> <param name="property">user ...
在这个“hibernate实例(一对多,多对一)”的主题中,我们将深入探讨两种重要的关联关系:一对一(One-to-One)和一对多(One-to-Many)。 **一对一关联(One-to-One)** 在一对一关联中,一个实体与另一个实体之间...
多对多关系和一对多关系是实际项目中常见的数据关系,理解并熟练运用它们,能够帮助我们构建更高效、更易于维护的Java应用程序。在使用这些关系时,需要注意双向关联的处理,以及在配置文件中正确设置懒加载和级联...
- **缓存**: Hibernate的二级缓存可以显著提升性能,通过配置可以缓存查询结果和实体实例。 - **批处理**: 使用批处理更新和插入,可以减少数据库交互次数,提高效率。 - **连接池**: 配置合适的连接池,如...
- `Configuration`类:负责读取和解析hibernate.cfg.xml配置文件,生成SessionFactory实例。 - `SessionFactoryImpl`:实际的SessionFactory实现,包含Session的创建逻辑和缓存管理。 - `SessionImpl`:Session的...
在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本篇将详细解析Hibernate的配置文件,帮助你深入理解其工作原理和配置过程。 ...
总结而言,`hibernate-jpa-2.1-api-1.0.0.Final.jar`是Hibernate对JPA 2.1规范的实现,包含了丰富的持久化、查询、事务和多租户等功能。深入理解并熟练运用其中的API,能够帮助开发者构建高效、灵活的数据访问层,...
这个实例适合初学者学习,旨在帮助理解Hibernate如何处理双向一对多关系。通过实践,新手可以了解如何配置映射文件、定义实体类以及编写必要的数据库操作代码。对于经验丰富的开发者来说,此实例可能过于基础,但...
2. 探索映射:深入理解实体类与数据库表之间的映射机制,包括一对一、一对多、多对一、多对多关系的配置。 3. 深入查询:掌握HQL和Criteria API的高级用法,如分页、排序、子查询等。 4. 事务管理:了解Hibernate的...
标题中的“hibernate 映射-一对多双向”指的是在Java Hibernate框架中处理数据库关系映射中的一对多关联关系,并且这种关联是双向的。Hibernate是一个对象关系映射(ORM)工具,它允许开发者用Java对象来表示数据库...
标题中的“Hibernate通过Composite-element配置外联表实例”是指在Java持久化框架Hibernate中,使用Composite-element注解或XML配置来处理复杂类型的属性,这些属性通常涉及到一对多或一对一的关系,但它们被存储在...
在Hibernate中,这可能涉及到一对多或多对多的关系映射,比如一个用户可以有多个订单,每个订单又包含多个商品等复杂关系。 在学习这个实例时,首先要理解Struts的配置文件(struts-config.xml),它定义了各个...
在Java的持久化框架Hibernate中,一对多关系是数据库中常见的关联类型,它表示一个...通过这两个实例,我们可以学习到如何配置、操作以及优化一对多关系,从而在实际开发中更有效地利用Hibernate进行数据持久化操作。