Hibernate 6 中文文档(四)(版本6.3.1.Final)

 译自:An Introduction to Hibernate 6

文中相关链接需要科学上网方可访问,后续有时间再逐个翻译。文章中如果存在任何不准确的地方,欢迎指正。

尚未完成,不断更新中....

 系列文章:

Hibernate 6 中文文档(一)

Hibernate 6 中文文档(二)

Hibernate 6 中文文档(三)

Hibernate 6 中文文档(四)

Hibernate 6 中文文档(五)

目录

4.对象/关系映射

4.1. 映射实体继承层次

4.2. 映射到数据库表格

4.3. 实体映射到表格

4.4. 关联映射到表格

4.5. 映射到列

4.6. 将基本属性映射到列

4.7. 将关联映射到外键列

4.8. 映射表格之主键连接

4.9. 列长度和自适应列类型

4.10. 大对象(LOBs)

4.11. 映射可嵌入类型到 UDTs 或 JSON

4.12. SQL列类型映射总结

4.14. 派生标识

4.15. 添加约束


4.对象/关系映射

在给定了一个领域模型(即一组带有我们在前一章中介绍的所有注解的实体类)之后,Hibernate 将愉快地根据它推断出完整的关系型模式,甚至在你礼貌地询问时,还可以将它导出到你的数据库中。

生成的模式将会非常合理和可行,尽管如果你仔细观察,你可能会发现一些问题。例如,每个 VARCHAR 列的长度都是相同的,VARCHAR(255)。

但是,我刚刚描述的这个过程,我们称之为自上而下的映射,实际上并不适用于最常见的对象/关系映射的使用场景。通常,Java 类通常不会先于关系模式存在。通常情况下,我们已经有了一个关系型模式,并且我们正在围绕这个模式构建我们的领域模型。这被称为自下而上的映射。

开发人员通常将现有的关系数据库称为“遗留”数据。这常常让人联想到那些糟糕的“遗留应用程序”,可能是用 COBOL 或其他什么语言写的。但是,遗留数据具有很大的价值,学会如何处理它们非常重要。

特别是在自下而上的映射过程中,我们经常需要自定义推断出的对象/关系映射。这是一个有点乏味的主题,所以我们不打算在这方面花太多篇幅。相反,我们将快速浏览一下最重要的映射注解。

Hibernate 的 SQL 命名约定 计算机上的小写字母已经有很长一段时间了。大多数开发人员早就学会了在 MixedCase、camelCase,甚至 snake_case 中编写的文本比在 SHOUTYCASE 中编写的文本更容易阅读。这一点不仅适用于 SQL,也适用于任何其他语言。

因此,20 多年来,Hibernate 项目上的约定是:

  • 查询语言标识符使用小写编写,
  • 表名使用 MixedCase 编写,
  • 列名使用 camelCase 编写。

也就是说,我们简单地采用了 Java 的优秀约定,并将其应用到了 SQL 中。

当然,我们无法强制你遵循这个约定,即使我们愿意。实际上,你可以很容易地编写一个 PhysicalNamingStrategy,如果你愿意的话,可以将表名和列名设置得像这样 ALL UGLY AND SHOUTY。但是,默认情况下,这是 Hibernate 遵循的约定,而且实际上是一个相当合理的约定。

4.1. 映射实体继承层次

在实体类继承中,我们看到实体类可以存在于继承层次结构中。有三种基本策略可以将实体层次结构映射到关系数据库表中。我们将它们放入一个表格中,以便更容易比较它们之间的差异点。

表格 20. 实体继承映射策略

策略映射多态查询约束规范化何时使用
SINGLE_TABLE将层次结构中的每个类映射到同一张表,并使用鉴别器列的值确定每行代表哪个具体类。只需查询一张表即可检索到给定类的实例。由子类声明的属性映射到没有 NOT NULL 约束的列。任何关联都可以有外键约束。子类数据是非规范化的。
JOINED将层次结构中的每个类映射到一个单独的表,但每个表只映射该类自身声明的属性。必须通过以下方式联接该类的表:与其超类映射的所有表以及其子类映射的所有表。任何属性都可以映射到带有 NOT NULL 约束的列。任何关联都可以有外键约束。表格是规范化的。
TABLE_PER_CLASS将层次结构中的每个具体类映射到一个单独的表,但将所有继承属性都非规范化到表中。必须在该类的表和其子类映射的所有表之间执行 UNION 操作。针对超类的关联在数据库中不能有相应的外键约束。任何属性都可以映射到带有 NOT NULL 约束的列。超类数据是非规范化的。

这三种映射策略由 InheritanceType 枚举定义。我们使用 @Inheritance 注解来指定继承映射策略。

对于带有鉴别器列的映射,我们应该:

  • 通过在根实体上使用 @DiscriminatorColumn 注解来指定鉴别器列的名称和类型,并且
  • 通过在层次结构中的每个实体上使用 @DiscriminatorValue 注解来指定鉴别器的值。

对于单表继承,我们总是需要一个鉴别器:

@Entity
@DiscriminatorColumn(discriminatorType=CHAR, name="kind")
@DiscriminatorValue('P')
class Person { ... }

@Entity
@DiscriminatorValue('A')
class Author { ... }

我们不需要明确指定 @Inheritance(strategy=SINGLE_TABLE),因为那是默认值。

对于 JOINED 继承,我们不需要鉴别器:

@Entity
@Inheritance(strategy=JOINED)
class Person { ... }

@Entity
class Author { ... }

然而,如果我们愿意的话,可以添加一个鉴别器列,在这种情况下,多态查询的生成 SQL 将会稍微简单一些。

类似地,对于 TABLE_PER_CLASS 继承,我们有:

@Entity
@Inheritance(strategy=TABLE_PER_CLASS)
class Person { ... }

@Entity
class Author { ... }

Hibernate 不允许 TABLE_PER_CLASS 继承映射使用鉴别器列,因为它们没有意义,也没有优势。

请注意,在这种情况下,像这样的多态关联:

@ManyToOne Person person;

是一个不好的主意,因为无法创建同时针对两个映射表的外键约束。

4.2. 映射到数据库表格

下面的注解精确指定了领域模型元素如何映射到关系模型的表格:

表格 21. 映射表格的注解

注解用途
@Table将实体类映射到其主表格。
@SecondaryTable为实体类定义一个附加表格。
@JoinTable将多对多或多对一关联映射到其关联表格。
@CollectionTable@ElementCollection 映射到其表格。

前两个注解用于将实体映射到其主表格,可选择性地,还可以映射到一个或多个附加表格。

4.3. 实体映射到表格

默认情况下,一个实体映射到一个单独的表格,可以使用 @Table 注解指定表格:

@Entity
@Table(name="People")
class Person { ... }

然而,@SecondaryTable 注解允许我们将其属性分散到多个附加表格中:

@Entity
@Table(name="Books")
@SecondaryTable(name="Editions")
class Book { ... }

@Table 注解不仅可以指定一个名称:

表格 22. @Table 注解成员

注解成员用途
name映射表格的名称
schema 💀表格所属的模式(schema)
catalog 💀表格所属的目录(catalog)
uniqueConstraints一个或多个 @UniqueConstraint 注解,声明多列的唯一约束
indexes一个或多个 @Index 注解,每个声明一个索引

只有当领域模型分布在多个模式中时,通过注解显式指定模式才有意义。

否则,在 @Table 注解中硬编码模式(或目录)是个坏主意。相反地:

  • 可以设置配置属性 hibernate.default_schema(或 hibernate.default_catalog),或者
  • 在 JDBC 连接 URL 中简单地指定模式。

@SecondaryTable 注解更有趣:

表格 23. @SecondaryTable 注解成员

注解成员用途
name映射表格的名称
schema 💀表格所属的模式(schema)
catalog 💀表格所属的目录(catalog)
uniqueConstraints一个或多个 @UniqueConstraint 注解,声明多列的唯一约束
indexes一个或多个 @Index 注解,每个声明一个索引
pkJoinColumns一个或多个 @PrimaryKeyJoinColumn 注解,指定主键列映射
foreignKey一个 @ForeignKey 注解,指定 @PrimaryKeyJoinColumns 的外键约束

SINGLE_TABLE 实体继承层次结构中,在子类上使用 @SecondaryTable 注解可以得到一种 SINGLE_TABLE 和 JOINED 继承的混合形式。

4.4. 关联映射到表格

@JoinTable 注解指定了一个关联表格,即一个保存两个关联实体的外键的表格。通常,这个注解与 @ManyToMany 关联一起使用:

@Entity
class Book {
    ...

    @ManyToMany
    @JoinTable(name="BooksAuthors")
    Set<Author> authors;

    ...
}

但是,它甚至也可以用于将 @ManyToOne@OneToOne 关联映射到关联表格。

@Entity
class Book {
    ...

    @ManyToOne(fetch=LAZY)
    @JoinTable(name="BookPublisher")
    Publisher publisher;

    ...
}

在这里,关联表格的一个列上应该有一个唯一约束。

@Entity
class Author {
    ...

    @OneToOne(optional=false, fetch=LAZY)
    @JoinTable(name="AuthorPerson")
    Person author;

    ...
}

在这里,关联表格的两个列上应该有唯一约束。

表格 24. @JoinTable 注解成员

注解成员用途
name映射的关联表格的名称
schema 💀表格所属的模式(schema)
catalog 💀表格所属的目录(catalog)
uniqueConstraints一个或多个 @UniqueConstraint 注解,声明多列的唯一约束
indexes一个或多个 @Index 注解,每个声明一个索引
joinColumns一个或多个 @JoinColumn 注解,指定关联方表格中的外键列映射
inverseJoinColumns一个或多个 @JoinColumn 注解,指定非关联方表格中的外键列映射
foreignKey一个 @ForeignKey 注解,指定 joinColumns 上的外键约束名称
inverseForeignKey一个 @ForeignKey 注解,指定 inverseJoinColumns 上的外键约束名称

为了更好地理解这些注解,我们首先必须讨论一般的列映射。

4.5. 映射到列

以下注解指定了领域模型元素如何映射到关系模型表格的列:

表格 25. 映射列的注解

注解用途
@Column将属性映射到一个列。
@JoinColumn将关联映射到一个外键列。
@PrimaryKeyJoinColumn将用于将次表格与其主表格、或在 JOINED 继承中将子类表格与其根类表格连接的主键进行映射。
@OrderColumn指定用于维护列表顺序的列。
@MapKeyColumn指定用于持久化映射键的列。

我们使用 @Column 注解来映射基本属性。

4.6. 将基本属性映射到列

@Column 注解不仅仅用于指定列名。

表格 26. @Column 注解成员

注解成员用途
name映射的列的名称
table此列所属的表格的名称
lengthVARCHAR、CHAR 或 VARBINARY 列类型的长度
precisionFLOAT、DECIMAL、NUMERIC、TIME 或 TIMESTAMP 列类型的小数位数
scaleDECIMAL 或 NUMERIC 列类型的小数位数,即小数点右边的精度
unique列是否具有 UNIQUE 约束
nullable列是否具有 NOT NULL 约束
insertable列是否应该出现在生成的 SQL INSERT 语句中
updatable列是否应该出现在生成的 SQL UPDATE 语句中
columnDefinition 💀应该用于声明列的 DDL 片段

我们不再建议使用 columnDefinition,因为它会导致不可移植的 DDL。Hibernate 有更好的方法来定制生成的 DDL,使用这些方法可以在不同的数据库中实现可移植性。

在这里,我们看到了使用 @Column 注解的四种不同方式:

@Entity
@Table(name="Books")
@SecondaryTable(name="Editions")
class Book {
    @Id @GeneratedValue
    @Column(name="bookId") // 自定义列名
    Long id;

    @Column(length=100, nullable=false) // 将列声明为 VARCHAR(100) NOT NULL
    String title;

    @Column(length=17, unique=true, nullable=false) // 将列声明为 VARCHAR(17) NOT NULL UNIQUE
    String isbn;

    @Column(table="Editions", updatable=false) // 列属于次表格,并且不会被更新
    int edition;
}

我们不使用 `@Column` 来映射关联。

4.7. 将关联映射到外键列

@JoinColumn 注解用于自定义外键列。

表格 27. @JoinColumn 注解成员

注解成员用途
name映射的外键列的名称
table此列所属的表格的名称
referencedColumnName映射的外键列引用的列的名称
unique列是否具有 UNIQUE 约束
nullable列是否具有 NOT NULL 约束
insertable列是否应该出现在生成的 SQL INSERT 语句中
updatable列是否应该出现在生成的 SQL UPDATE 语句中
columnDefinition 💀应该用于声明列的 DDL 片段
foreignKey一个 @ForeignKey 注解,指定 FOREIGN KEY 约束的名称

一个外键列不一定要引用被关联表格的主键。它可以引用被关联实体的任何其他唯一键,甚至是次表格的唯一键。

在这里,我们看到了如何使用 @JoinColumn 定义一个 @ManyToOne 关联,将外键列映射到 Book 的 @NaturalId

@Entity
@Table(name="Items")
class Item {
    ...

    @ManyToOne(optional=false)  
    @JoinColumn(name = "bookIsbn", referencedColumnName = "isbn",  
                foreignKey = @ForeignKey(name="ItemsToBooksBySsn"))
    Book book;

    ...
}

如果这让你感到困惑:

  • bookIsbnItems 表格中外键列的名称,
  • 它引用了 Books 表格的唯一键 isbn,并且
  • 它有一个名为 ItemsToBooksBySsn 的外键约束。

请注意,foreignKey 成员是完全可选的,只影响 DDL 生成。

如果不使用 @ForeignKey 显式指定名称,Hibernate 将生成一个相当丑陋的名称。这是因为某些数据库上外键名称的最大长度受到极大限制,我们需要避免冲突。公平地说,如果你只是用生成的 DDL 进行测试,那么这是完全可以接受的。

对于复合外键,我们可能有多个 @JoinColumn 注解:

@Entity
@Table(name="Items")
class Item {
    ...

    @ManyToOne(optional=false)
    @JoinColumn(name = "bookIsbn", referencedColumnName = "isbn")
    @JoinColumn(name = "bookPrinting", referencedColumnName = "printing")
    Book book;

    ...
}

如果我们需要指定 @ForeignKey,这会变得有点混乱:

@Entity
@Table(name="Items")
class Item {
    ...

    @ManyToOne(optional=false)
    @JoinColumns(value = {@JoinColumn(name = "bookIsbn", referencedColumnName = "isbn"),
                          @JoinColumn(name = "bookPrinting", referencedColumnName = "printing")},
                 foreignKey = @ForeignKey(name="ItemsToBooksBySsn"))
    Book book;

    ...
}

对于映射到 @JoinTable 的关联,获取关联需要两个连接,所以我们必须在 @JoinTable 注解内声明 @JoinColumns

@Entity
class Book {
    @Id @GeneratedValue
    Long id;

    @ManyToMany
    @JoinTable(joinColumns=@JoinColumn(name="bookId"),
               inverseJoinColumns=@joinColumn(name="authorId"),
               foreignKey=@ForeignKey(name="BooksToAuthors"))
    Set<Author> authors;

    ...
}

同样,foreignKey 成员是可选的。

4.8. 映射表格之主键连接

@PrimaryKeyJoinColumn 是一种专用注解,用于映射:

  • @SecondaryTable 的主键列,它同时也是一个外键,引用主表格;
  • JOINED 继承层次结构中,映射子类表格的主键列,它同时也是一个外键,引用由根实体映射的主表格。

表格 28. @PrimaryKeyJoinColumn 注解成员

注解成员用途
name映射的外键列的名称
referencedColumnName映射的外键列引用的列的名称
columnDefinition 💀应该用于声明列的 DDL 片段
foreignKey一个 @ForeignKey 注解,指定 FOREIGN KEY 约束的名称

在映射子类表格的主键时,我们将 @PrimaryKeyJoinColumn 注解放在实体类上:

@Entity
@Table(name="People")
@Inheritance(strategy=JOINED)
class Person { ... }

@Entity
@Table(name="Authors")
@PrimaryKeyJoinColumn(name="personId") // Authors 表格的主键
class Author { ... }

但是,在映射次表格的主键时,@PrimaryKeyJoinColumn 注解必须位于 @SecondaryTable 注解内部:

@Entity
@Table(name="Books")
@SecondaryTable(name="Editions",
                pkJoinColumns = @PrimaryKeyJoinColumn(name="bookId")) // Editions 表格的主键
class Book {
    @Id @GeneratedValue
    @Column(name="bookId") // Books 表格的主键名称
    Long id;

    ...
}

4.9. 列长度和自适应列类型

Hibernate 根据 @Column 注解指定的列长度自动调整生成的 DDL 中的列类型。所以,通常情况下,我们不需要显式指定一个列应该是 TEXT 或 CLOB 类型,也不用担心在 MySQL 上会出现 TINYTEXT、MEDIUMTEXT、TEXT、LONGTEXT 这样的类型,因为Hibernate会根据需要选择其中一个类型,以适应我们指定的字符串长度。

在这里,Length 类中定义的常量值非常有用:

表格 29. 预定义的列长度

常量描述
DEFAULT255当没有显式指定长度时,VARCHAR 或 VARBINARY 列的默认长度
LONG32600VARCHAR 或 VARBINARY 列上允许的最大列长度,在 Hibernate 支持的每个数据库上都允许
LONG1632767使用 16 位表示的最大长度(但是对于某些数据库的 VARCHAR 或 VARBINARY 列来说,这个长度太大了)
LONG322147483647Java 字符串的最大长度

我们可以在 @Column 注解中使用这些常量:

@Column(length=LONG)
String text;

@Column(length=LONG32)
byte[] binaryData;

通常,这就足够了,可以在Hibernate中使用大对象类型。

4.10. 大对象(LOBs)

JPA 提供了 @Lob 注解,用于指定字段应该被持久化为 BLOB 或 CLOB。

@Lob 注解的语义 规范实际上说,该字段应该被持久化为

…​作为一个数据库支持的大对象类型。

这是相当不清晰的,而且规范还继续说

…​Lob 注解的处理是提供者相关的…​

这并没有太大帮助。

Hibernate 对这个注解的解释是我们认为最合理的方式。在 Hibernate 中,一个被 @Lob 注解的属性将使用 PreparedStatement 的 setClob()setBlob() 方法写入到 JDBC,并且将使用 ResultSet 的 getClob()getBlob() 方法从 JDBC 中读取。

但是,通常情况下使用这些 JDBC 方法是不必要的!JDBC 驱动完全有能力在 String 和 CLOB 之间,或者在 byte[] 和 BLOB 之间进行转换。所以,除非你明确需要使用这些 JDBC LOB API,否则你不需要 @Lob 注解。

相反,正如我们在“列长度和自适应列类型”中看到的那样,你只需要指定足够大的列长度来容纳你计划写入该列的数据。

不幸的是,PostgreSQL 的驱动程序不允许通过 JDBC LOB API 读取 BYTEA 或 TEXT 类型的列。

这个 Postgres 驱动程序的限制导致了一个整个博客界和 stackoverflow 上的问题回答者推荐使用复杂的方式来修改用于 Postgres 的 Hibernate 方言,以允许使用 setString() 写入属性,然后使用 getString() 读取。

但是,简单地移除 @Lob 注解会达到完全相同的效果。

总结:

  • 在 PostgreSQL 中,@Lob 总是表示 OID 类型,
  • @Lob 永远不应该用于映射 BYTEA 或 TEXT 类型的列,而
  • 请不要相信你在 stackoverflow 上看到的一切。

最后,作为一种替代方法,Hibernate 允许你声明一个类型为 java.sql.Blobjava.sql.Clob 的属性。

@Entity
class Book {
    ...
    Clob text;
    Blob coverArt;
    ....
}

优点是 java.sql.Clobjava.sql.Blob 在原则上可以索引多达 2^63 个字符或字节的数据,比你可以放入 Java 字符串或 byte[] 数组(或你的计算机)中的数据要多得多。

要给这些字段分配一个值,我们需要使用 LobHelper。我们可以从 Session 中获取它:

LobHelper helper = session.getLobHelper();
book.text = helper.createClob(text);
book.coverArt = helper.createBlob(image);

原则上,Blob 和 Clob 对象提供了从服务器读取或流式传输 LOB 数据的有效方法。

Book book = session.find(Book.class, bookId);
String text = book.text.getSubString(1, textLength);
InputStream bytes = book.images.getBinaryStream();

当然,这里的行为非常依赖于 JDBC 驱动程序,所以我们不能保证在你的数据库上这样做是明智的。

4.11. 映射可嵌入类型到 UDTs 或 JSON

有几种可用的方式可以在数据库端表示可嵌入类型。

可嵌入类型作为 UDTs

首先,一个非常好的选择,至少在 Java 记录类型的情况下,并且对于支持用户定义类型(UDTs)的数据库来说,是定义一个代表记录类型的 UDT。Hibernate 6 使得这个过程非常简单。只需使用新的 @Struct 注解为记录类型或持有对它的引用的属性进行注解:

@Embeddable
@Struct(name="PersonName")
record Name(String firstName, String middleName, String lastName) {}
@Entity
class Person {
    ...
    Name name;
    ...
}

这将得到以下的 UDT:

create type PersonName as (firstName varchar(255), middleName varchar(255), lastName varchar(255))

并且 Author 表的 name 列将具有类型 PersonName。

将可嵌入类型映射到 JSON

第二个可用的选项是将可嵌入类型映射到 JSON(或 JSONB)列。现在,如果你是从零开始定义数据模型,我们不会完全推荐这样做,但如果你需要映射具有预定义 JSON 类型列的现有表格,这是一个有用的方式。由于可嵌入类型是可以嵌套的,我们可以使用这种方式映射某些 JSON 格式,甚至可以使用 HQL 查询 JSON 属性。

目前,不支持 JSON 数组!

要将可嵌入类型的属性映射到 JSON,我们必须为属性注解 @JdbcTypeCode(SqlTypes.JSON),而不是为可嵌入类型进行注解。但是,如果我们想要使用 HQL 查询它的属性,可嵌入类型 Name 仍然应该被注解为 @Embeddable

@Embeddable
record Name(String firstName, String middleName, String lastName) {}
@Entity
class Person {
    ...
    @JdbcTypeCode(SqlTypes.JSON)
    Name name;
    ...
}

我们还需要将 Jackson 或 JSONB 的实现(例如 Yasson)添加到运行时类路径中。如果我们想使用 Jackson,我们可以在 Gradle 构建中添加以下行:

runtimeOnly 'com.fasterxml.jackson.core:jackson-databind:{jacksonVersion}'

现在 Author 表的 name 列将具有类型 jsonb,Hibernate 将自动使用 Jackson 将 Name 序列化为 JSON 格式,并从 JSON 格式反序列化为 Name。

4.12. SQL列类型映射总结

正如我们所见,有很多注解会影响Java类型在DDL中映射到SQL列类型。在这里,我们总结了在本章的后半部分中我们刚刚看到的这些注解,以及在之前章节中已经提到的一些注解。

映射SQL列类型的注解

注解解释
@Enumerated指定枚举类型应该如何持久化。
@Nationalized使用国际化字符类型:NCHAR、NVARCHAR 或 NCLOB。
@Lob使用 JDBC LOB APIs 来读取和写入被注解的属性。
@Array将集合映射到具有指定长度的 SQL ARRAY 类型。
@Struct将可嵌入类型映射到具有给定名称的 SQL UDT。
@TimeZoneStorage指定时区信息应该如何持久化。
@JdbcType@JdbcTypeCode使用 JdbcType 的实现来映射任意的 SQL 类型。

此外,还有一些配置属性对基本类型如何映射到SQL列类型具有全局影响:

类型映射设置

配置属性名目的
hibernate.use_nationalized_character_data启用默认情况下使用国际化字符类型。
hibernate.type.preferred_boolean_jdbc_type指定映射布尔类型的默认SQL列类型。
hibernate.type.preferred_uuid_jdbc_type指定映射UUID的默认SQL列类型。
hibernate.type.preferred_duration_jdbc_type指定映射Duration的默认SQL列类型。
hibernate.type.preferred_instant_jdbc_type指定映射Instant的默认SQL列类型。
hibernate.timezone.default_storage指定存储时区信息的默认策略。

这些是全局设置,因此相当笨拙。我们建议除非你有一个非常充分的理由,否则不要去修改这些设置。

在这个章节中,我们还有一个主题想要讨论。

4.13. 映射到公式

Hibernate 允许我们将实体的属性映射到涉及到映射表的列的 SQL 公式。因此,该属性是一种"派生"值。

映射到公式的注解

注解目的
@Formula将属性映射到 SQL 公式。
@JoinFormula将关联映射到 SQL 公式。
@DiscriminatorFormula在单表继承中使用 SQL 公式作为鉴别器。

例如:

@Entity
class Order {
    ...
    @Column(name = "sub_total", scale=2, precision=8)
    BigDecimal subTotal;

    @Column(name = "tax", scale=4, precision=4)
    BigDecimal taxRate;

    @Formula("sub_total * (1.0 + tax)")
    BigDecimal totalWithTax;
    ...
}

在这个例子中,totalWithTax 属性通过 SQL 公式 sub_total * (1.0 + tax) 计算得出。

4.14. 派生标识

当一个实体的部分主键从关联的“父”实体继承而来时,该实体具有派生标识。我们在讨论具有共享主键的一对一关联时已经遇到了一种派生标识的特殊情况。

但是,@ManyToOne 关联也可以是派生标识的一部分。也就是说,可以将外键列或多个外键列包含为组合主键的一部分。在Java方面,有三种不同的方式来表示这种情况:

  1. 使用带有@IdClass但不带有@MapsId的方式。
  2. 使用带有@IdClass和@MapsId的方式。
  3. 使用带有@EmbeddedId和@MapsId的方式。

假设我们有一个如下定义的Parent实体类:

@Entity
class Parent {
    @Id
    Long parentId;

    ...
}

parentId字段保存了Parent表的主键,该主键也将成为每个Child实体的复合主键的一部分。

第一种方式

在第一种稍微简单的方法中,我们定义了一个@IdClass来表示Child的主键:

class DerivedId {
    Long parent;
    String childId;

    // 构造函数,equals,hashcode等
    ...
}

并且Child实体类上使用了@Id注解的@ManyToOne关联:

@Entity
@IdClass(DerivedId.class)
class Child {
    @Id
    String childId;

    @Id @ManyToOne
    @JoinColumn(name="parentId")
    Parent parent;

    ...
}

然后,Child表的主键由列(childId,parentId)组成。

第二种方式

这种方法是可以的,但有时最好为主键的每个元素拥有一个字段。我们可以使用我们之前遇到的@MapsId注解:

@Entity
@IdClass(DerivedId.class)
class Child {
    @Id
    Long parentId;
    @Id
    String childId;

    @ManyToOne
    @MapsId(Child_.PARENT_ID) // 对Child.parentId进行类型安全引用
    @JoinColumn(name="parentId")
    Parent parent;

    ...
}

我们使用了之前看到的方法来以类型安全的方式引用Child的parentId属性。

请注意,我们必须将列映射信息放在@MapsId注解上,而不是@Id字段上。

我们必须稍微修改我们的@IdClass,以便字段名称对齐:

class DerivedId {
    Long parentId;
    String childId;

    // 构造函数,equals,hashcode等
    ...
}

第三种方式

第三种选择是将我们的@IdClass重新定义为@Embeddable。实际上,我们不需要更改DerivedId类,但是我们需要添加该注解。

@Embeddable
class DerivedId {
    Long parentId;
    String childId;

    // 构造函数,equals,hashcode等
    ...
}

然后我们可以在Child中使用@EmbeddedId:

@Entity
class Child {
    @EmbeddedId
    DerivedId id;

    @ManyToOne
    @MapsId(DerivedId_.PARENT_ID) // 对DerivedId.parentId进行类型安全引用
    @JoinColumn(name="parentId")
    Parent parent;

    ...
}

在@IdClass和@EmbeddedId之间的选择取决于个人喜好。@EmbeddedId或许更加DRY(Don't Repeat Yourself)。

4.15. 添加约束

数据库约束非常重要。即使你确信你的程序没有bug 🧐,它可能并不是唯一一个能够访问数据库的程序。约束有助于确保不同的程序(以及人类管理员)可以友好地相互配合。

Hibernate会自动将某些约束添加到生成的DDL中:主键约束、外键约束和一些唯一约束。但通常需要:

  • 添加额外的唯一约束,
  • 添加检查约束,或者
  • 自定义外键约束的名称。

我们已经学过如何使用 @ForeignKey 注解来指定外键约束的名称。

有两种方法可以向表中添加唯一约束:

  1. 使用 @Column(unique=true) 指定单列唯一键,或者
  2. 使用 @UniqueConstraint 注解在多列上定义唯一性约束。
@Entity
@Table(uniqueConstraints=@UniqueConstraint(columnNames={"title", "year", "publisher_id"}))
class Book { ... }

这个注解可能看起来有点丑,但实际上它作为文档是非常有用的。

@Check 注解可以向表中添加检查约束。

@Entity
@Check(name="ValidISBN", constraints="length(isbn)=13")
class Book { ... }

@Check 注解通常用在字段级别上:

@Id @Check(constraints="length(isbn)=13")
String isbn;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
符合Java习惯的关系数据库持久化 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一(many-to-one) 5.1.11. 一对一 5.1.12. 自然ID(natural-id) 5.1.13. 组件(component), 动态组件(dynamic-component) 5.1.14. properties 5.1.15. 子类(subclass) 5.1.16. 连接的子类(joined-subclass) 5.1.17. 联合子类(union-subclass) 5.1.18. 连接(join) 5.1.19. 键(key) 5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings ) 6.2.1. 集合外键(Collection foreign keys) 6.2.2. 集合元素(Collection elements) 6.2.3. 索引集合类(Indexed collections) 6.2.4. 值集合于多对多关联(Collections of values and many-to-many associations) 6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary associations) 6.3.5. 使用<idbag> 6.4. 集合例子(Collection example) 7. 关联关系映射 7.1. 介绍 7.2. 单向关联(Unidirectional associations) 7.2.1. 多对一(many to one) 7.2.2. 一对一(one to one) 7.2.3. 一对多(one to many) 7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向关联(Bidirectional associations) 7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 (Collections of dependent objects) 8.3. 组件作为Map的索引(Components as Map indices ) 8.4. 组件作为联合标识符(Components as composite identifiers) 8.5. 动态组件 (Dynamic components) 9. 继承映射(Inheritance Mappings) 9.1. 三种策略 9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 11.3.4. 定制自动版本化行为 11.4. 悲观锁定(Pessimistic Locking) 11.5. 连接释放模式(Connection Release Modes) 12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) 13.2. 批量更新(Batch updates) 13.3. StatelessSession (无状态session)接口 13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select子句 14.6. 聚集函数 14.7. 多态查询 14.8. where子句 14.9. 表达式 14.10. order by子句 14.11. group by子句 14.12. 子查询 14.13. HQL示例 14.14. 批量的UPDATE和DELETE 14.15. 小技巧 & 小窍门 15. 条件查询(Criteria Queries) 15.1. 创建一个Criteria 实例 15.2. 限制结果集内容 15.3. 结果集排序 15.4. 关联 15.5. 动态关联抓取 15.6. 查询示例 15.7. 投影(Projections)、聚合(aggregation)和分组(grouping) 15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) 16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.5. 返回非受管实体(Returning non-managed entities) 16.1.6. 处理继承(Handling inheritance) 16.1.7. 参数(Parameters) 16.2. 命名SQL查询 16.2.1. 使用return-property来明确地指定字段/别名 16.2.2. 使用存储过程来查询 16.3. 定制SQL用来create,update和delete 16.4. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching strategies) 19.1.1. 操作延迟加载的关联 19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using subselect fetching) 19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/写缓存(Strategy: read/write) 19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能(Understanding Collection performance) 19.5.1. 分类(Taxonomy) 19.5.2. Lists, maps 和sets用于更新效率最高 19.5.3. Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. Schema自动生成(Automatic schema generation) 20.1.1. 对schema定制化(Customizing the schema) 20.1.2. 运行该工具 20.1.3. 属性(Properties) 20.1.4. 使用Ant(Using Ant) 20.1.5. 对schema的增量更新(Incremental schema updates) 20.1.6. 用Ant来增量更新schema(Using Ant for incremental schema updates) 20.1.7. Schema 校验 20.1.8. 使用Ant进行schema校验 21. 示例:父子关系(Parent Child Relationships) 21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. 示例:复杂映射实例 23.1. Employer(雇主)/Employee(雇员) 23.2. Author(作家)/Work(作品) 23.3. Customer(客户)/Order(订单)/Product(产品) 23.4. 杂例 23.4.1. "Typed" one-to-one association 23.4.2. Composite key example 23.4.3. 共有组合键属性的多对多(Many-to-many with shared composite key attribute) 23.4.4. Content based discrimination 23.4.5. Associations on alternate keys 24. 最佳实践(Best Practices) 等等。。。
HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一(many-to-one) 5.1.11. 一对一 5.1.12. 自然ID(natural-id) 5.1.13. 组件(component), 动态组件(dynamic-component) 5.1.14. properties 5.1.15. 子类(subclass) 5.1.16. 连接的子类(joined-subclass) 5.1.17. 联合子类(union-subclass) 5.1.18. 连接(join) 5.1.19. 键(key) 5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings ) 6.2.1. 集合外键(Collection foreign keys) 6.2.2. 集合元素(Collection elements) 6.2.3. 索引集合类(Indexed collections) 6.2.4. 值集合于多对多关联(Collections of values and many-to-many associations) 6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary associations) 6.3.5. 使用<idbag> 6.4. 集合例子(Collection example) 7. 关联关系映射 7.1. 介绍 7.2. 单向关联(Unidirectional associations) 7.2.1. 多对一(many to one) 7.2.2. 一对一(one to one) 7.2.3. 一对多(one to many) 7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向关联(Bidirectional associations) 7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 (Collections of dependent objects) 8.3. 组件作为Map的索引(Components as Map indices ) 8.4. 组件作为联合标识符(Components as composite identifiers) 8.5. 动态组件 (Dynamic components) 9. 继承映射(Inheritance Mappings) 9.1. 三种策略 9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 11.3.4. 定制自动版本化行为 11.4. 悲观锁定(Pessimistic Locking) 11.5. 连接释放模式(Connection Release Modes) 12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) 13.2. 批量更新(Batch updates) 13.3. StatelessSession (无状态session)接口 13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select子句 14.6. 聚集函数 14.7. 多态查询 14.8. where子句 14.9. 表达式 14.10. order by子句 14.11. group by子句 14.12. 子查询 14.13. HQL示例 14.14. 批量的UPDATE和DELETE 14.15. 小技巧 & 小窍门 15. 条件查询(Criteria Queries) 15.1. 创建一个Criteria 实例 15.2. 限制结果集内容 15.3. 结果集排序 15.4. 关联 15.5. 动态关联抓取 15.6. 查询示例 15.7. 投影(Projections)、聚合(aggregation)和分组(grouping) 15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) 16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.5. 返回非受管实体(Returning non-managed entities) 16.1.6. 处理继承(Handling inheritance) 16.1.7. 参数(Parameters) 16.2. 命名SQL查询 16.2.1. 使用return-property来明确地指定字段/别名 16.2.2. 使用存储过程来查询 16.3. 定制SQL用来create,update和delete 16.4. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching strategies) 19.1.1. 操作延迟加载的关联 19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using subselect fetching) 19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/写缓存(Strategy: read/write) 19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能(Understanding Collection performance) 19.5.1. 分类(Taxonomy) 19.5.2. Lists, maps 和sets用于更新效率最高 19.5.3. Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. Schema自动生成(Automatic schema generation) 20.1.1. 对schema定制化(Customizing the schema) 20.1.2. 运行该工具 20.1.3. 属性(Properties) 20.1.4. 使用Ant(Using Ant) 20.1.5. 对schema的增量更新(Incremental schema updates) 20.1.6. 用Ant来增量更新schema(Using Ant for incremental schema updates) 20.1.7. Schema 校验 20.1.8. 使用Ant进行schema校验 21. 示例:父子关系(Parent Child Relationships) 21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. 示例:复杂映射实例 23.1. Employer(雇主)/Employee(雇员) 23.2. Author(作家)/Work(作品) 23.3. Customer(客户)/Order(订单)/Product(产品) 23.4. 杂例 23.4.1. "Typed" one-to-one association 23.4.2. Composite key example 23.4.3. 共有组合键属性的多对多(Many-to-many with shared composite key attribute) 23.4.4. Content based discrimination 23.4.5. Associations on alternate keys 24. 最佳实践(Best Practices) 表格清单 1. Hibernate v3翻译团队 3.1. Hibernate JDBC属性 3.2. Hibernate数据源属性 3.3. Hibernate配置属性 3.4. Hibernate JDBC和连接(connection)属性 3.5. Hibernate缓存属性 3.6. Hibernate事务属性 3.7. 其他属性 3.8. Hibernate SQL方言 (hibernate.dialect) 3.9. Hibernate日志类别 3.10. JTA TransactionManagers 9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. 缓存策略提供商(Cache Providers) 19.2. 各种缓存提供商对缓存并发策略的支持情况(Cache Concurrency Strategy Support) 20.1. Summary 20.2. SchemaExport命令行选项 20.3. SchemaExport 连接属性 20.4. SchemaUpdate命令行选项 20.5. SchemaValidator命令行参数
目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.1.1. EntityResolver 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.4.1. Generator 5.1.4.2. 高/低位算法(Hi/Lo Algorithm) 5.1.4.3. UUID算法(UUID Algorithm ) 5.1.4.4. 标识字段和序列(Identity columns and Sequences) 5.1.4.5. 程序分配的标识符(Assigned Identifiers) 5.1.4.6. 触发器实现的主键生成器(Primary keys assigned by triggers) 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一(many-to-one) 5.1.11. 一对一 5.1.12. 自然ID(natural-id) 5.1.13. 组件(component), 动态组件(dynamic-component) 5.1.14. properties 5.1.15. 子类(subclass) 5.1.16. 连接的子类(joined-subclass) 5.1.17. 联合子类(union-subclass) 5.1.18. 连接(join) 5.1.19. 键(key) 5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库对象(Auxiliary Database Objects) 6. 集合类(Collections)映射 6.1. 持久化集合类(Persistent collections) 6.2. 集合映射( Collection mappings ) 6.2.1. 集合外键(Collection foreign keys) 6.2.2. 集合元素(Collection elements) 6.2.3. 索引集合类(Indexed collections) 6.2.4. 值集合于多对多关联(Collections of values and many-to-many associations) 6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary associations) 6.3.5. 使用<idbag> 6.4. 集合例子(Collection example) 7. 关联关系映射 7.1. 介绍 7.2. 单向关联(Unidirectional associations) 7.2.1. 多对一(many to one) 7.2.2. 一对一(one to one) 7.2.3. 一对多(one to many) 7.3. 使用连接表的单向关联(Unidirectional associations with join tables) 7.3.1. 一对多(one to many) 7.3.2. 多对一(many to one) 7.3.3. 一对一(one to one) 7.3.4. 多对多(many to many) 7.4. 双向关联(Bidirectional associations) 7.4.1. 一对多(one to many) / 多对一(many to one) 7.4.2. 一对一(one to one) 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的关联映射 8. 组件(Component)映射 8.1. 依赖对象(Dependent objects) 8.2. 在集合中出现的依赖对象 (Collections of dependent objects) 8.3. 组件作为Map的索引(Components as Map indices ) 8.4. 组件作为联合标识符(Components as composite identifiers) 8.5. 动态组件 (Dynamic components) 9. 继承映射(Inheritance Mappings) 9.1. 三种策略 9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” 9.1.5. 每个具体类一张表(Table per concrete class) 9.1.6. Table per concrete class, using implicit polymorphism 9.1.7. 隐式多态和其他继承映射混合使用 9.2. 限制 10. 与对象共事 10.1. Hibernate对象状态(object states) 10.2. 使对象持久化 10.3. 装载对象 10.4. 查询 10.4.1. 执行查询 10.4.1.1. 迭代式获取结果(Iterating results) 10.4.1.2. 返回元组(tuples)的查询 10.4.1.3. 标量(Scalar)结果 10.4.1.4. 绑定参数 10.4.1.5. 分页 10.4.1.6. 可滚动遍历(Scrollable iteration) 10.4.1.7. 外置命名查询(Externalizing named queries) 10.4.2. 过滤集合 10.4.3. 条件查询(Criteria queries) 10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. 关注对象标识(Considering object identity) 11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application version checking) 11.3.2. 扩展周期的session和自动版本化 11.3.3. 脱管对象(deatched object)和自动版本化 11.3.4. 定制自动版本化行为 11.4. 悲观锁定(Pessimistic Locking) 11.5. 连接释放模式(Connection Release Modes) 12. 拦截器与事件(Interceptors and events) 12.1. 拦截器(Interceptors) 12.2. 事件系统(Event system) 12.3. Hibernate的声明式安全机制 13. 批量处理(Batch processing) 13.1. 批量插入(Batch inserts) 13.2. 批量更新(Batch updates) 13.3. StatelessSession (无状态session)接口 13.4. DML(数据操作语言)风格的操作(DML-style operations) 14. HQL: Hibernate查询语言 14.1. 大小写敏感性问题 14.2. from子句 14.3. 关联(Association)与连接(Join) 14.4. join 语法的形式 14.5. select子句 14.6. 聚集函数 14.7. 多态查询 14.8. where子句 14.9. 表达式 14.10. order by子句 14.11. group by子句 14.12. 子查询 14.13. HQL示例 14.14. 批量的UPDATE和DELETE 14.15. 小技巧 & 小窍门 15. 条件查询(Criteria Queries) 15.1. 创建一个Criteria 实例 15.2. 限制结果集内容 15.3. 结果集排序 15.4. 关联 15.5. 动态关联抓取 15.6. 查询示例 15.7. 投影(Projections)、聚合(aggregation)和分组(grouping) 15.8. 离线(detached)查询和子查询 15.9. 根据自然标识查询(Queries by natural identifier) 16. Native SQL查询 16.1. 使用SQLQuery 16.1.1. 标量查询(Scalar queries) 16.1.2. 实体查询(Entity queries) 16.1.3. 处理关联和集合类(Handling associations and collections) 16.1.4. 返回多个实体(Returning multiple entities) 16.1.4.1. 别名和属性引用(Alias and property references) 16.1.5. 返回非受管实体(Returning non-managed entities) 16.1.6. 处理继承(Handling inheritance) 16.1.7. 参数(Parameters) 16.2. 命名SQL查询 16.2.1. 使用return-property来明确地指定字段/别名 16.2.2. 使用存储过程来查询 16.2.2.1. 使用存储过程的规则和限制 16.3. 定制SQL用来create,update和delete 16.4. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 18.1.1. 指定同时映射XML和类 18.1.2. 只定义XML映射 18.2. XML映射元数据 18.3. 操作XML数据 19. 提升性能 19.1. 抓取策略(Fetching strategies) 19.1.1. 操作延迟加载的关联 19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using subselect fetching) 19.1.7. 使用延迟属性抓取(Using lazy property fetching) 19.2. 二级缓存(The Second Level Cache) 19.2.1. 缓存映射(Cache mappings) 19.2.2. 策略:只读缓存(Strategy: read only) 19.2.3. 策略:读/写缓存(Strategy: read/write) 19.2.4. 策略:非严格读/写缓存(Strategy: nonstrict read/write) 19.2.5. 策略:事务缓存(transactional) 19.3. 管理缓存(Managing the caches) 19.4. 查询缓存(The Query Cache) 19.5. 理解集合性能(Understanding Collection performance) 19.5.1. 分类(Taxonomy) 19.5.2. Lists, maps 和sets用于更新效率最高 19.5.3. Bag和list是反向集合类中效率最高的 19.5.4. 一次性删除(One shot delete) 19.6. 监测性能(Monitoring performance) 19.6.1. 监测SessionFactory 19.6.2. 数据记录(Metrics) 20. 工具箱指南 20.1. Schema自动生成(Automatic schema generation) 20.1.1. 对schema定制化(Customizing the schema) 20.1.2. 运行该工具 20.1.3. 属性(Properties) 20.1.4. 使用Ant(Using Ant) 20.1.5. 对schema的增量更新(Incremental schema updates) 20.1.6. 用Ant来增量更新schema(Using Ant for incremental schema updates) 20.1.7. Schema 校验 20.1.8. 使用Ant进行schema校验 21. 示例:父子关系(Parent Child Relationships) 21.1. 关于collections需要注意的一点 21.2. 双向的一对多关系(Bidirectional one-to-many) 21.3. 级联生命周期(Cascading lifecycle) 21.4. 级联与未保存值(Cascades and unsaved-value) 21.5. 结论 22. 示例:Weblog 应用程序 22.1. 持久化类 22.2. Hibernate 映射 22.3. Hibernate 代码 23. 示例:复杂映射实例 23.1. Employer(雇主)/Employee(雇员) 23.2. Author(作家)/Work(作品) 23.3. Customer(客户)/Order(订单)/Product(产品) 23.4. 杂例 23.4.1. "Typed" one-to-one association 23.4.2. Composite key example 23.4.3. 共有组合键属性的多对多(Many-to-many with shared composite key attribute) 23.4.4. Content based discrimination 23.4.5. Associations on alternate keys 24. 最佳实践(Best Practices)
目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一(many-to-one) 5.1.11. 一对一 5.1.12. 自然ID(natural-id) 5.1.13. 组件(component), 动态组件(dynamic-component) 5.1.14. properties 5.1.15. 子类(subclass) 5.1.16. 连接的子类(joined-subclass) 5.1.17. 联合子类(union-subclass) 5.1.18. 连接(join) 5.1.19. 键(key) 5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generat
NHibernate 参考文档手册 chm,NHIBERNATE-符合.Net习惯的关系数据库持久化,手册目录摘要:   前言   1. 第一个NHibernate应用程序   1.1. 开始NHibernate之旅   1.2. 第一个持久化类   1.3. 映射cat   1.4. 与Cat同乐   1.5. 总结   2. 体系结构(Architecture)   2.1. 概况(Overview)   2.2. 实例状态   2.3. 上下文相关的(Contextual)Session   3. 配置   3.1. 可编程的配置方式   3.2. 获得ISessionFactory   3.3. 用户自行提供ADO.NET连接   3.4. NHibernate提供ADO.NET连接   3.5. 可选的配置属性   3.5.1. SQL方言   3.5.2 外连接抓取(Outer Join Fetching)   3.5.3. 查询缓存   3.5.4. 查询语言中的替换   3.6. 日志   3.7. 实现NamingStrategy   3.8. XML配置文件   4. 持久化类(Persistent Classes)   4.1. 一个简单的POCO例子   4.1.1. 为持久化成员变量声明读写属性   4.1.2. 实现一个默认的构造器(constructor)   4.1.3. 提供一个标识属性(identifier property)(可选)   4.1.4. 使用非不可继承的(non-sealed)类以及虚方法(virtual methods) (可选)   4.2. 实现继承(Inheritance)   4.3. 实现 Equals() 和 GetHashCode() 方法   4.4. 持久化生命周期(Lifecycle)中的回调(Callbacks)   4.5. 合法性验证(IValidatable)回调   5. 对象/关系数据库映射基础(Basic O/R Mapping)   5.1. 映射定义(Mapping declaration)   5.1.1. XML名称空间   5.1.2. hibernate-mapping   5.1.3. class   5.1.4. id   5.1.4.1. (主键生成策略)generator   5.1.4.2. 高/低位算法(Hi/Lo Algorithm)   5.1.4.3. 唯一标识16进制算法(UUID Algorithm )   5.1.4.4. 唯一标识字符串算法   5.1.4.5. 唯一标识GUID算法   5.1.4.6. 标识字段和序列(Identity columns and Sequences)   5.1.4.7. 程序分配的标识符(Assigned Identifiers)   5.1.5. (联合主键)composite-id   5.1.6. 鉴别器(discriminator)   5.1.7. 版本(version)(可选)   5.1.8. 时间戳 (可选)   5.1.9. 属性   5.1.10. 多对一   5.1.11. 一对一   5.1.12. 组件(component), 动态组件(dynamic-component)   5.1.13. 子类   5.1.14. 连接的子类(joined-subclass)   5.1.15. 联合子类(union-subclass)   5.1.16. 连接   5.1.17. map, set, list, bag   5.1.18. 引用(import)   5.2. NHibernate 的类型   5.2.1. 实体(Entities)和值(values)   5.2.2. 基本值类型   5.2.3. 自定义值类型   5.2.4. Any类型映射   5.3. SQL中引号包围的标识符   5.4. 模块化映射文件   5.5. 数据库生成属性(Generated Properties)   5.6. 数据库辅助对象   6. 集合类(Collections)映射   6.1. 持久化集合类   6.2. 集合外键(Collection foreign keys)   6.3. 值集合于多对多关联(Collections of values and many-to-many associations)   6.4. 一对多关联   6.5. 延迟加载   6.6. 有序集合(Sorted collections)   6.7. 使用   6.8. 双向关联(Bidirectional associations)   6.9. 三重关联(Ternary associations)   6.10. 异质关联(Heterogeneous Associations)   6.11. 集合例子(Collection example)   7. 组件(Component)映射   7.1. 依赖对象(Dependent objects)   7.2. 在集合中出现的依赖对象 (Collections of dependent objects)   7.3. 组件作为IDictionary的索引
前言 ............................................................................ xi 1. 教程 ......................................................................... 1 1.1. 第一部分 - 第一个 Hibernate 应用程序 ................................. 1 1.1.1. 设置 ............................................................ 1 1.1.2. 第一个 class ................................................... 3 1.1.3. 映射文件 ........................................................ 4 1.1.4. Hibernate 配置 .................................................. 7 1.1.5. 用 Maven 构建 .................................................. 9 1.1.6. 启动和辅助类 .................................................... 9 1.1.7. 加载并存储对象 ................................................. 10 1.2. 第二部分 - 关联映射 ................................................. 13 1.2.1. 映射 Person 类 ................................................ 13 1.2.2. 单向 Set-based 的关联 ......................................... 14 1.2.3. 使关联工作 ..................................................... 15 1.2.4. 值类型的集合 ................................................... 17 1.2.5. 双向关联 ....................................................... 18 1.2.6. 使双向连起来 ................................................... 19 1.3. 第三部分 - EventManager web 应用程序 ................................. 20 1.3.1. 编写基本的 servlet ............................................. 20 1.3.2. 处理与渲染 ..................................................... 21 1.3.3. 部署与测试 ..................................................... 24 1.4. 总结 ................................................................. 25 2. 体系结构(Architecture) ..................................................... 27 2.1. 概况(Overview) ...................................................... 27 2.2. 实例状态 .............................................................. 29 2.3. JMX 整合 ............................................................. 30 2.4. 对 JCA 的支持 ........................................................ 30 2.5. 上下文相关的会话(Contextual Session) ................................ 30 3. 配置 ........................................................................ 33 3.1. 可编程的配置方式 ...................................................... 33 3.2. 获得 SessionFactory .................................................. 34 3.3. JDBC 连接 ............................................................ 34 3.4. 可选的配置属性 ........................................................ 36 3.4.1. SQL 方言 ...................................................... 42 3.4.2. 外连接抓取(Outer Join Fetching) .............................. 43 3.4.3. 二进制流(Binary Streams) ..................................... 43 3.4.4. 二级缓存与查询缓存 ............................................. 43 3.4.5. 查询语言中的替换 ............................................... 43 3.4.6. Hibernate 的统计(statistics)机制 ............................. 43 3.5. 日志 ................................................................. 44 3.6. 实现 NamingStrategy .................................................. 44 3.7. XML 配置文件 ......................................................... 45 3.8. J2EE 应用程序服务器的集成 ............................................. 46 3.8.1. 事务策略配置 ................................................... 46HIBERNATE - Relational Persis... iv 3.8.2. JNDI 绑定的 SessionFactory ..................................... 47 3.8.3. 在 JTA 环境下使用 Current Session context(当前 session 上下文) 管理 .................................................................. 48 3.8.4. JMX 部署 ...................................................... 48 4. 持久化类(Persistent Classes) .............................................. 51 4.1. 一个简单的 POJO 例子 ................................................. 51 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) ............. 52 4.1.2. 提供一个标识属性(identifier property)(可选) ................. 52 4.1.3. 使用非final的类(可选) ........................................ 53 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators) (可选) .............................................................. 53 4.2. 实现继承(Inheritance) ............................................... 53 4.3. 实现 equals() 和 hashCode() 方法: ................................... 54 4.4. 动态模型(Dynamic models) ............................................ 55 4.5. 元组片断映射(Tuplizers) ............................................. 57 4.6. EntityNameResolvers ................................................... 58 5. 对象/关系数据库映射基础(Basic O/R Mapping) ................................. 61 5.1. 映射定义(Mapping declaration) ....................................... 61 5.1.1. Doctype ........................................................ 62 5.1.2. Hibernate-mapping .............................................. 63 5.1.3. 类 ............................................................. 64 5.1.4. id ............................................................. 67 5.1.5. 增强的标识符生成器 ............................................. 71 5.1.6. 标识符生成器的优化 ............................................. 72 5.1.7. composite-id ................................................... 72 5.1.8. 鉴别器(discriminator) ........................................ 73 5.1.9. 版本(version)(可选) ........................................ 74 5.1.10. timestamp(可选) .............................................. 75 5.1.11. Property ...................................................... 76 5.1.12. 多对一(many-to-one) ......................................... 78 5.1.13. 一对一 ........................................................ 80 5.1.14. 自然 ID(natural-id) ......................................... 82 5.1.15. 组件(component)和动态组件(dynamic-component) ............... 82 5.1.16. 属性(Properties) ............................................ 83 5.1.17. 子类(subclass) .............................................. 84 5.1.18. 连接的子类(joined-subclass) ................................. 85 5.1.19. 联合子类(union-subclass) .................................... 86 5.1.20. 连接(join) .................................................. 87 5.1.21. Key ........................................................... 88 5.1.22. 字段和规则元素(column and formula elements) ................. 89 5.1.23. 引用(import) ................................................ 90 5.1.24. Any ........................................................... 90 5.2. Hibernate 的类型 ..................................................... 91 5.2.1. 实体(Entities)和值(values) ................................. 91v 5.2.2. 基本值类型 ..................................................... 92 5.2.3. 自定义值类型 ................................................... 93 5.3. 多次映射同一个类 ...................................................... 94 5.4. SQL 中引号包围的标识符 ............................................... 95 5.5. 其他元数据(Metadata) ................................................ 95 5.5.1. 使用 XDoclet 标记 ............................................. 95 5.5.2. 使用 JDK 5.0 的注解(Annotation) .............................. 97 5.6. 数据库生成属性(Generated Properties) ................................ 98 5.7. 字段的读写表达式 ...................................................... 98 5.8. 辅助数据库对象(Auxiliary Database Objects) .......................... 99 6. 集合映射(Collection mappings) ............................................ 101 6.1. 持久化集合类(Persistent collections) ............................... 101 6.2. 集合映射( Collection mappings ) ................................... 102 6.2.1. 集合外键(Collection foreign keys) ........................... 103 6.2.2. 集合元素(Collection elements) ............................... 104 6.2.3. 索引集合类(Indexed collections) ............................. 104 6.2.4. 值集合于多对多关联(Collections of values and many-to-many associations) ....................................................... 105 6.2.5. 一对多关联(One-to-many Associations) ........................ 107 6.3. 高级集合映射(Advanced collection mappings) ......................... 108 6.3.1. 有序集合(Sorted collections) ................................ 108 6.3.2. 双向关联(Bidirectional associations) ........................ 109 6.3.3. 双向关联,涉及有序集合类 ...................................... 111 6.3.4. 三重关联(Ternary associations) .............................. 112 6.3.5. Using an <idbag> ............................................. 112 6.4. 集合例子(Collection example) ....................................... 113 7. 关联关系映射 ............................................................... 117 7.1. 介绍 ................................................................ 117 7.2. 单向关联(Unidirectional associations) .............................. 117 7.2.1. 多对一(many-to-one) ......................................... 117 7.2.2. 一对一(One-to-one) .......................................... 117 7.2.3. 一对多(one-to-many) ......................................... 118 7.3. 使用连接表的单向关联(Unidirectional associations with join tables) .. 119 7.3.1. 一对多(one-to-many) ......................................... 119 7.3.2. 多对一(many-to-one) ......................................... 120 7.3.3. 一对一(One-to-one) .......................................... 120 7.3.4. 多对多(many-to-many) ........................................ 121 7.4. 双向关联(Bidirectional associations) ............................... 122 7.4.1. 一对多(one to many)/多对一(many to one) .................... 122 7.4.2. 一对一(One-to-one) .......................................... 123 7.5. 使用连接表的双向关联(Bidirectional associations with join tables) ... 124 7.5.1. 一对多(one to many)/多对一(many to one) .................... 124 7.5.2. 一对一(one to one) ......................................... 125 7.5.3. 多对多(many-to-many) ........................................ 126HIBERNATE - Relational Persis... vi 7.6. 更复杂的关联映射 ..................................................... 126 8. 组件(Component)映射 ....................................................... 129 8.1. 依赖对象(Dependent objects) ........................................ 129 8.2. 在集合中出现的依赖对象(Collections of dependent objects) ........... 131 8.3. 组件作为 Map 的索引(Components as Map indices ) .................... 132 8.4. 组件作为联合标识符(Components as composite identifiers) ............ 132 8.5. 动态组件(Dynamic components) ....................................... 134 9. 继承映射(Inheritance Mapping) ............................................ 137 9.1. 三种策略 ............................................................. 137 9.1.1. 每个类分层结构一张表(Table per class hierarchy) ............. 137 9.1.2. 每个子类一张表(Table per subclass) .......................... 138 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志 (Discriminator) .................................................... 138 9.1.4. 混合使用“每个类分层结构一张表”和“每个子类一张表” ........... 139 9.1.5. 每个具体类一张表(Table per concrete class) .................. 140 9.1.6. 每个具体类一张表,使用隐式多态 ................................ 141 9.1.7. 隐式多态和其他继承映射混合使用 ................................ 142 9.2. 限制 ................................................................ 142 10. 与对象共事 ................................................................ 145 10.1. Hibernate 对象状态(object states) ................................. 145 10.2. 使对象持久化 ........................................................ 145 10.3. 装载对象 ............................................................ 146 10.4. 查询 ............................................................... 148 10.4.1. 执行查询 ..................................................... 148 10.4.2. 过滤集合 ..................................................... 152 10.4.3. 条件查询(Criteria queries) ................................. 153 10.4.4. 使用原生 SQL 的查询 ......................................... 153 10.5. 修改持久对象 ........................................................ 153 10.6. 修改脱管(Detached)对象 ............................................ 154 10.7. 自动状态检测 ........................................................ 155 10.8. 删除持久对象 ........................................................ 156 10.9. 在两个不同数据库间复制对象 .......................................... 156 10.10. Session 刷出(flush) .............................................. 157 10.11. 传播性持久化(transitive persistence) ............................. 158 10.12. 使用元数据 ......................................................... 160 11. Read-only entities ........................................................ 161 11.1. Making persistent entities read-only ................................ 162 11.1.1. Entities of immutable classes ................................ 162 11.1.2. Loading persistent entities as read-only ..................... 162 11.1.3. Loading read-only entities from an HQL query/criteria ......... 163 11.1.4. Making a persistent entity read-only ......................... 165 11.2. Read-only affect on property type .................................. 166 11.2.1. Simple properties ............................................ 167 11.2.2. Unidirectional associations .................................. 167
FusionCompute 6.3.1 cna.iso 是华为云推出的一种软件镜像文件。cna.iso 是 Cloud Native Architecture(云原生架构)的缩写,是华为云云原生计算产品 FusionCompute 的安装镜像文件。FusionCompute 是华为云的一种云计算虚拟化平台,基于云原生架构构建,提供企业级的云计算解决方案。 cna.iso 是 FusionCompute 6.3.1 版本的安装镜像文件,它包含了安装 FusionCompute 所需的软件和组件。通过 cna.iso 文件,用户可以在物理服务器上进行安装,并将其转化为虚拟化主机,以便在上面部署和管理虚拟机和容器。 FusionCompute 6.3.1 版本是华为云云原生计算产品的一个重要更新版本,带来了许多新的功能和改进。它包括了更强大的虚拟化管理能力、高可用性和可靠性、性能优化以及安全增强等方面的改进。此外,FusionCompute 还支持基于 Kubernetes 的容器管理平台,提供了更便捷的容器化部署和管理方式。 使用 FusionCompute 6.3.1 cna.iso,用户可以快速搭建起高性能、可靠的云计算基础设施,提供灵活的资源分配和管理。它可以广泛应用于各种企业和组织,满足不同规模和需求的云计算场景。通过 FusionCompute,用户可以更高效地利用硬件资源,降低 IT 成本,提升业务的灵活性和可扩展性。 总之,FusionCompute 6.3.1 cna.iso 是华为云云原生计算产品 FusionCompute 的安装镜像文件,它为用户提供了搭建高性能、可靠的云计算基础设施的能力,以满足不同企业和组织的云计算需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风间琉璃c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值