`

[转]hibernate随笔

阅读更多

对那些看重删除性能的系统,推荐所有的键都应该定义为on-delete=”cascade”,这样Hibernate将使用数据库级的on cascade delete约束,而不是多个delete语句。注意:这个特性会绕过Hibernate通常对版本数据(versioned data)采用的乐观锁策略。
not-null和update属性在映射单向一对多关联的时候有用。如果你映射一个单向一对多关联到非空的(non-nullable)外键,你必须用<key not-null=”true”>定义此键字段。

任何接受column属性的映射元素都可以选择接受<column>子元素。同样的,formula子元素也可以替换<formula>属性。

<any>映射元素定义了一种从多个表到类的多态关联。这种类型的映射常常需要多于一个字段。第一个字段持有被关联实体的类型,其他的字段持有标识符。只应该在非常特殊的情况下使用(比如,审计log,用户会话数据等等)。

要建立一个双向的多对多关联,只需要映射两个many-to-many关联到同一个数据库表中,并再定义其中的一端为inverse(使用哪一端要根据你的选择,便它不能是一个索引集合)。

要建立一个一对多的双向关系,你可以通过把一个一对多关联,作为一个多对一关联映射到同一张表的字段上,并且在“多”的那一端定义inverse=”truse”。

————————————————————
关联关系映射

在传统的数据建模中,允许为Null值的外键被认为是一种不好的实践,因此一般应该使用不允许为Null的外键。

单向many-to-one关联是最常见的单向关联关系。
基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。惟一的不同就是单向一对一关联中的外键字段具有惟一性约束。如:
<class name=”Person”>
<id name=”id” column=”personId”>
    <generator class=”native”>
</id>
<many-to-one name=”address” column=”addressId” unique=”true” not-null=”true”/>
</class>

<class name=”Address”>
<id name=”id” column=”addressId”>
    <generator class=”native”/>
</id>
</class>

基于主键关联的单向一对一关联通常使用一个特定的id生成器。与上面的例子的区别是关联的方向。
<class name=”Person”>
<id name=”id” column=”personId”>
    <generator class=”native”>
</id>
</class>

<class name=”Address”>
<id name=”id” column=”personId”>
    <generator class=”foreign”>
      <param name=”property”>person</param>
    </generator>
</id>
<one-to-one name=”person” constrained=”true”>
</class>

基于外键关联的单向一对多关联是一种很少见的情况,并不推荐使用。对于这种关联关系最好使用连接表。

基于连接表的单向一对多关联应该优先被采用。通过指定unique=”true”,我们可以把多样性从多对多改变为一对多。

基于连接表的单向一对一关联非常少见。

双向多对一关联是最常见的关联关系。(这也是标准的父/子关联关系。)
如果使用List(或者其他有序集合类),需要设置外键对应的key列为not null,让hibernate来从集合端管理关联,维护每个元素的索引(通过设置update=”false” and insert=”false”来对另一端反向操作)。
假若集合映射的<key>元素对应的底层外键字段是NOT NULL的,那么为这一key元素定义not-null=”true”是很重要的。不要仅仅为可能的嵌套<column>元素定义not-null=”true”,<key>元素也是需要的。

基于外键关联的双向一对一关联也很常见。
基于主键关联的一对一关联需要使用特定的id生成器。

基于连接表的双向一对多关联。注意inverse=”true”可以出现在关联的任意一端,即collection端或者join端。
基于连接表的双向一对一关联极为罕见。

组件(Componet)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的引用。
组件不支持共享引用。组件的值可以为空。每当Hibernate重新加载一个包含组件的对象,如果该组件的所有字段为空,Hibernate将假定整个组件为空。
组件的属性可以是任意一种Hibernate类型。
<componect>元素还允许有<parent>子元素,用来表明componect类的一个属性是指向包含它的实体的引用。

如果你定义的Set包含组合元素(composite-element),正确地实现equals()和hashCode()是非常重要的。
组合元素可以包含组件,但不能包含集合。

如果使用<set>标签,一个组合元素的映射不支持可能为空的属性。因此,要么在组合元素中使用不能为空的属性,要第选择使用<list>,<map>,<bag>或者<idbag>而不是<set>。组合元素有个特别的用法是它可以包含一个<many-to-one>元素。

组件类可以作为一个实体类的标识符,但必须满足:
1、必须实现java.io.Serializable接口。
2、
必须重新实现equals()和hashCode()方法,始终和组合关键字在数据库中的概念保持一致。

不能使用一个IdentifierGenerator产生组合关键字。一个应用程序必须分配它自己的标识符。

Hibernate collections被当作其所属实体而不是其包含实体的一个逻辑部分。它主要体现为以下几点:
1、当删除或增加collection中的对象的时候,collection所属者的版本值会递增。
2、如果一个从collection中移除的对像是一个值类型的实例,比如conposite element,那么这个对象的持久化状态就会终止,其在数据库中对应的记录会被删除。同样,向collection增加一个值类型的实例将会使之立即被持久化。
3、如果从一对多或者多对多关联的collection中移除一个实体,在缺少情况下这个对象并不会被删除。这个行为是完全符合逻辑的–改变一个实体的内部状态不应该使与它关联的实体消失掉。同样,向collection增加一个实体不会使之被持久化。
实际上,向collection增加一个实体的缺省动作只是在两个实体之间创建一个连接而已,同样移除的时候也只是删除连接。

对于one-to-many,如果将连接建在one这一端(如一个parent有多个child),则每次插入需要两条sql语句。正确的方式应该是将连接添加到many这一端(inverse=”true”)。
如:
Parent p = (Parent)session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();
为了更有条理,可以为Parent加一个addChild()方法。
public void addChild(Child c)
{
    c.setParent(this);
    children.add(c);
}

分享到:
评论

相关推荐

    hibernate和java类型转换

    hibernate和java类型转换,hibernate和java类型转换

    Hibernate 配置各种数据库

    Hibernate 配置各种数据库 Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等...

    Hibernate入门到精通

    "Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...

    hibernate的三种状态及其相互转换

    这是一个讲解了关于hibernate三种状态之间的转换,如果想知道他们之间的相关总结和理解,这是一个不错的选择

    hibernate-extensions和Middlegen-Hibernate

    《hibernate-extensions与Middlegen-Hibernate:数据库到Java对象的自动化转换》 在Java的持久化层开发中,Hibernate作为一款强大的ORM(对象关系映射)框架,极大地简化了数据库操作。然而,手动编写实体类和映射...

    hibernate和MySQL的jar

    标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...

    HibernateTools-3.2.4

    HibernateTools是Java开发人员在使用Hibernate ORM框架时的有力辅助工具集,主要目的是为了提高开发效率,简化数据库操作。在HibernateTools 3.2.4版本中,它包含了一系列的特性与插件,以支持更便捷地进行对象关系...

    hibernate jar包:hibernate-commons-annotations-4.0.1.Final.jar等

    Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...

    Hibernate3的依赖包

    Hibernate3是一个广泛使用的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作,极大地简化了Java应用程序与数据库之间的交互。在这个"Hibernate3的依赖包"中,包含了运行Hibernate3应用...

    Hibernate,hibernate笔记

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。这个框架将数据库操作转化为对Java对象的操作,简化了数据持久化的复杂度。以下是对Hibernate的一些关键知识点的...

    hibernate3.zip 包含hibernate3.jar

    Hibernate3 是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发人员可以更加专注于业务逻辑而不是数据库的细节。这个`hibernate3.zip`压缩包包含了`hibernate3.jar`,它是Hibernate 3版本的核心库,包含...

    hibernate3必要jar包

    Hibernate3 是一个非常重要的Java持久化框架,它允许开发者将对象模型与数据库关系模型进行映射,从而简化了数据存取的过程。这个压缩包“hibernate3必要jar包”显然是针对Hibernate3版本的,已经去除了冗余的库文件...

    Beginning Hibernate: For Hibernate 5

    ### 关于《Beginning Hibernate: For Hibernate 5》的知识点总结 #### Hibernate 5 概述 - **定义**: Hibernate 是一款流行的开源对象关系映射(ORM)框架,它简化了数据库与 Java 对象之间的交互过程。 - **版本**...

    hibernate 5.2.15

    hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15hibernate 5.2.15

    hibernate-release-5.2.10

    Hibernate是Java平台上的一款开源对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作。在SSH(Spring、Struts、Hibernate)框架中,Hibernate作为持久层的解决方案,极大地简化了数据库操作的...

    kingbaseV8 hibernate jdbc 驱动

    在Java开发环境中,与KingbaseV8数据库进行交互通常会用到Hibernate框架和JDBC驱动。 Hibernate是一个优秀的对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作,通过将Java对象与数据库表进行映射,...

    Hibernate-extensions 完整安装包

    《Hibernate-Extensions全面指南》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足更复杂的业务需求,Hibernate还提供了丰富的扩展功能,这就是我们今天要...

    Hibernate入门jar包

    Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使开发者可以更加专注于业务逻辑而不是数据访问层的实现。本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之...

    Hibernate关系映射XML生成工具

    此外,随着技术的发展,许多现代ORM框架如JPA和Spring Data JPA提供了更高级的抽象,可以完全摆脱XML映射,转而使用注解来描述对象关系映射。 总的来说,"Middlegen-Hibernate-r5"是面向Hibernate用户的一款实用...

    hibernate3全部jar包:hibernate3.jar.zip 下载

    Hibernate3 是一个强大的Java持久化框架,它允许开发者将数据库操作与业务逻辑解耦,使得应用程序的开发更为简便。这个“hibernate3全部jar包:hibernate3.jar.zip”包含了所有必要的库文件,方便用户一次性下载并...

Global site tag (gtag.js) - Google Analytics