Hibernate学习--"一对多"和"多对一"关系配置实例

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&amp;characterEncoding=UTF-8&amp;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提供这么简明的例子!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值