`
cowgun888
  • 浏览: 6445 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernet映射学习笔记之映射

阅读更多
version(版本检查) 检查version/timestamp字段
all(全部) 检查全部字段
dirty(脏检查)只检察修改过的字段
none(不检查)不使用乐观锁定
强烈建议你在Hibernate中使用version/timestamp字段来进行乐观锁定。 对性能来说,这是最好的选择,并且这也是唯一能够处理在session外进行操作的策略(例如: 在使用Session.merge()的时候)。
对Hibernate映射来说视图和表是没有区别的,这是因为它们在数据层都是透明的( 注意:一些数据库不支持视图属性,特别是更新的时候)。有时你想使用视图,但却不能在数据库 中创建它(例如:在遗留的schema中)。这样的话,你可以映射一个不可变的(immutable)并且是 只读的实体到一个给定的SQL子查询表达式:
<class name="Summary">
    <subselect>
        select item.name, max(bid.amount), count(*)
        from item
        join bid on bid.item_id = item.id
        group by item.name
    </subselect>
    <synchronize table="item"/>
    <synchronize table="bid"/>
    <id name="name"/>
    ...
</class>
定义这个实体用到的表为同步(synchronize),确保自动刷新(auto-flush)正确执行, 并且依赖原实体的查询不会返回过期数据。<subselect>在属性元素 和一个嵌套映射元素中都可见。

1.一对一关联
有两种不同的一对一关联:
主键关联
惟一外键关联
主键关联不需要额外的表字段;如果两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值!
比如说,对下面的Employee和Person进行主键一对一关联:
<one-to-one name="person" class="Person"/>
<one-to-one name="employee" class="Employee" constrained="true"/>
现在我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个被成为foreign的特殊的hibernate标识符生成策略:
<class name="person" table="PERSON">
    <id name="id" column="PERSON_ID">
        <generator class="foreign">
            <param name="property">employee</param>
        </generator>
    </id>
    ...
    <one-to-one name="employee"
        class="Employee"
        constrained="true"/>
</class>
一个刚刚保存的Person实例被赋予和该Person的employee属性所指向的Employee实例同样的关键字值。
另一种方式是一个外键和一个惟一关键字对应,上面的Employee和Person的例子,如果使用这种关联方式,可以表达成:
<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>
如果在Person的映射加入下面几句,这种关联就是双向的:
<one-to-one name"employee" class="Employee" property-ref="person"/>

2.多对一
一个典型的简单many-to-one定义例子:
<many-to-one name="product" class="Product" column="PRODUCT_ID"/>
property-ref属性只应该用来对付遗留下来的数据库系统, 可能有外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况下。 这是一种十分丑陋的关系模型。比如说,假设Product类有一个惟一的序列号, 它并不是主键。(unique属性控制Hibernate通过SchemaExport工具进行的DDL生成。)
<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>
那么关于OrderItem 的映射可能是:
<many-to-one name="product" property-ref="serialNumber" column="PRODUCT_SERIAL_NUMBER"/>
当然,我们决不鼓励这种用法。
如果被引用的唯一主键由关联实体的多个属性组成,你应该在名称为<properties>的元素 里面映射所有关联的属性。
假若被引用的唯一主键是组件的属性,你可以指定属性路径:
<many-to-one name="owner" property-ref="identity.ssn" column="OWNER_SSN"/>

3.一对多关联
一对多关联通过外键连接两个类对应的表,而没有中间集合表。 这个关系模型失去了一些Java集合的语义:
一个被包含的实体的实例只能被包含在一个集合的实例中
一个被包含的实体的实例只能对应于集合索引的一个值中
一个从Product到Part的关联需要关键字字段,可能还有一个索引字段指向Part所对应的表。 <one-to-many>标记指明了一个一对多的关联。
<one-to-many
        class="ClassName"
        not-found="ignore|exception"
        entity-name="EntityName"
        node="element-name"
        embed-xml="true|false"
    />
class(必须):被关联类的名称。
not-found (可选 - 默认为exception): 指明若缓存的标示值关联的行缺失,该如何处理:  ignore 会把缺失的行作为一个空关联处理。
entity-name (可选): 被关联的类的实体名,作为class的替代。
例子
<set name="bars">
    <key column="foo_id"/>
    <one-to-many class="org.hibernate.Bar"/>
</set>
注意:<one-to-many>元素不需要定义任何字段。 也不需要指定表名。
重要提示:如果一对多关联中的外键字段定义成NOT NULL,你必须把<key>映射声明为not-null="true",或者使用双向关联,并且标明inverse="true"。参阅本章后面关于双向关联的讨论。
下面的例子展示一个Part实体的map,把name作为关键字。( partName 是Part的持久化属性)。注意其中的基于公式的索引的用法。
<map name="parts"
        cascade="all">
    <key column="productId" not-null="true"/>
    <map-key formula="partName"/>
    <one-to-many class="Part"/>
</map>

4.多对多关联
例子:首先, 一组字符串:
<set name="names" table="NAMES">
    <key column="GROUPID"/>
    <element column="NAME" type="string"/>
</set>
包含一组整数的bag(还设置了order-by参数指定了迭代的顺序):
<bag name="sizes"
        table="item_sizes"
        order-by="size asc">
    <key column="item_id"/>
    <element column="size" type="integer"/>
</bag>
一个实体数组,在这个案例中是一个多对多的关联(注意这里的实体是自动管理生命周期的对象(lifecycle objects),cascade="all"):
<array name="addresses"
        table="PersonAddress"
        cascade="persist">
    <key column="personId"/>
    <list-index column="sortOrder"/>
    <many-to-many column="addressId" class="Address"/>
</array>
一个map,通过字符串的索引来指明日期:
<map name="holidays"
        table="holidays"
        schema="dbo"
        order-by="hol_name asc">
    <key column="id"/>
    <map-key column="hol_name" type="string"/>
    <element column="hol_date" type="date"/>
</map>
一个组件的列表:(下一章讨论)
<list name="carComponents"
        table="CarComponents">
    <key column="carId"/>
    <list-index column="sortOrder"/>
    <composite-element class="CarComponent">
        <property name="price"/>
        <property name="type"/>
        <property name="serialNumber" column="serialNum"/>
    </composite-element>
</list>
分享到:
评论

相关推荐

    hibernet

    标题"hibernate"指的是Hibernate,这是一个流行的对象关系映射(ORM)框架,主要用于Java应用程序,而".net"通常关联于Microsoft的.NET框架,它是一个用于构建各种类型应用程序的开发平台。虽然Hibernate主要在Java...

    SSH学习spring struts,hibernet

    spring struts,hibernet整合学习

    struts spring hibernet开发

    struts spring hibernet开发

    HIBERNET教程

    描述提到“学习HIBERNET的好资源,详细的介绍了它使用方法。一步步的教你,成为高手。”这暗示了教程内容全面,不仅涵盖了基础概念,还可能包括高级技巧和最佳实践,旨在帮助初学者逐步进阶为Hibernate的专家。 **...

    Struts+Spring+Hibernet整合例子

    Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子 Struts+Spring+Hibernet整合例子

    hibernet面试笔试题

    Hibernate 是一个广泛使用的Java对象关系映射(ORM)框架,它简化了数据库操作,使开发者可以使用面向对象的编程方式来处理数据库交互。在面试和笔试中,Hibernate 相关的问题是考察开发者数据库操作技能的重要部分...

    hibernet的jar包

    hibernet运行时所需的jar包,它是运行hibernet时所必须的,谢谢下载

    java学习(ssh) action structs spring hibernet

    它提供了一种声明式的方式,将Java对象映射到数据库表上,从而极大地简化了数据访问层的编码工作。 接下来,我们将根据给定的部分内容,详细解释几个关键知识点: ### 1. Servlet与Struts2的关系 Servlet是Java EE...

    hibernet实例

    标题中的“hibernate实例”指的是关于Hibernate框架的实际应用示例。...如果要深入学习Hibernate,这些实例将是非常宝贵的资源,因为它们提供了实际操作的机会,帮助理解理论知识并解决可能出现的问题。

    hibernet的PPT

    **标题与描述解析** 标题"hibernate的PPT"暗示了我们将要探讨的主题是关于Hibernate,一个在Java开发中广泛使用的对象关系映射...学习和理解这些内容,可以帮助开发者更好地在Java应用中使用Hibernate进行数据库操作。

    hibernet的最新jar包.zip

    Hibernate是一个强大的开源对象关系映射(ORM)框架,用于Java编程语言。它允许开发者以面向对象的方式处理数据库交互,大大简化了Java应用的数据持久层开发。ORM框架将数据库表与Java类关联起来,使得数据库操作...

    OA 项目(struct+hibernet+sql),java jsp java内部培训时做的,很适合学习框架的同志参考

    本项目以“struct+hibernate+sql”为核心,结合Java、Ajax和JSP,为初学者提供了一个深入学习框架的实践平台。下面将详细介绍这些技术在OA项目中的应用及其重要性。 1. Struts(Structs)框架: Struts 是一个基于...

    JAVAB/S架构资讯网struts、spring、hibernet

    通过学习和实践这个项目,开发者可以深入理解Java B/S架构的运作方式,以及SSH框架如何协同工作,为Web应用开发提供强大支持。这将对提升Java Web开发技能,尤其是对于初学者,是非常有价值的。

    structs+hibernet用户登录系统

    Structs主要用于处理MVC(Model-View-Controller)架构中的控制器部分,而Hibernate则是一个强大的对象关系映射(ORM)工具,用于简化数据库操作。下面将详细介绍这两个框架在构建一个用户登录系统的应用及其相关...

    Hibernet要点解析

    ### Hibernet要点解析 #### 什么是实体关系 实体关系指的是数据模型中不同实体之间的相互联系。在软件开发中,实体通常被表示为类,并通过这些类来构建应用程序的数据层。实体之间的关系可以是一对一、一对多或多...

    hibernet支持xml配置文件跳转

    在Java的持久化框架Hibernate中,XML配置文件是至关重要的组成部分,它定义了数据库连接、实体映射以及事务管理等核心设置。标题“hibernate支持xml配置文件跳转”指出,Hibernate允许开发者直接从代码中跳转到XML...

    Struts2+Spring+Hibernet+JPA+sitemesh+log4j

    3. **Hibernate**:Hibernate是一个优秀的对象关系映射(ORM)工具,它简化了数据库操作,将Java对象与数据库表之间的映射关系通过配置文件或注解进行管理。在"SSH2"中,Hibernate作为持久层框架,处理数据库的CRUD...

    hibernet5.21的jar包

    **hibernate5.21的jar包**是面向Java开发者的一个强大持久层框架,它提供了对象关系映射(ORM)的功能,使得开发者可以使用Java对象来操作数据库,而无需直接编写SQL语句。这个jar包是Hibernate 5.20版本的更新,...

    hibernet swing 影碟租赁系统

    在影碟租赁系统中,Hibernate通过实体类(如Customer、DVD、Rental)将业务对象与数据库表进行映射,使得数据的增删改查操作变得直观且易于维护。 再者,Java Swing是用于创建桌面应用的GUI(图形用户界面)工具包...

Global site tag (gtag.js) - Google Analytics