利用HibernateXML文件创建映射
立即解锁
发布时间: 2025-08-24 00:55:03 阅读量: 1 订阅数: 2 

# 利用 Hibernate XML 文件创建映射
## 1. 映射文件概述
映射文件在建立对象模型与数据库模式之间的关系时起着关键作用。它既可以将单个类映射到数据库,也能映射多个类。此外,映射还能描述标准查询(如 HQL 和 SQL)以及过滤器。
## 2. Hibernate 类型
### 2.1 实体(Entities)
实体通常是使用 `<class>` 或 `<subclass>` 元素映射到数据库的 POJO 类。实体也可以是动态映射(实际上是映射的映射),不过需要将 `SessionFactory` 的默认实体模式设置为 `dynamic-map`。
POJO 的优势在于能保留编译时的类型安全,而动态映射在构建原型时能快速投入使用。另外,实体还可以用 Dom4J Document 对象表示,这在从现有 Hibernate 数据库导入和导出数据时很有用,但并非 Hibernate 日常使用的核心功能。
### 2.2 组件(Components)
组件类型处于实体和值之间。当类的表示简单,且其实例与另一个类的实例存在强一对一关系时,它就适合作为另一个类的组件。
例如:
```java
public class NetworkInterface {
public int id;
public String name;
public String manufacturer;
public MacAddress physicalAddress;
}
```
这种方式的优点是可以省去组件的主键以及与包含表的连接。但如果组件选择不当(如实际是多对一关系),组件列中就会不必要地重复数据。
### 2.3 值(Values)
非实体和组件的所有内容都是值。一般来说,这些对应于数据库支持的数据类型、集合类型,以及可选的一些用户定义类型。
Hibernate 提供了自己的值类型名称,Java 类型根据这些名称定义,如下表所示:
| Hibernate 3 Type | Corresponding Java Type |
| --- | --- |
| integer | int, java.lang.Integer |
| long | long, java.lang.Long |
| short | short, java.lang.Short |
| float | float, java.lang.Float |
| double | double, java.lang.Double |
| character | char, java.lang.Character |
| byte | byte, java.lang.Byte |
| boolean, yes_no, true_false | boolean, java.lang.Boolean |
| string | java.lang.String |
| date, time, timestamp | java.util.Date |
| calendar, calendar_date | java.util.Calendar |
| big_decimal | java.math.BigDecimal |
| big_integer | java.math.BigInteger |
| locale | java.util.Locale |
| timezone | java.util.TimeZone |
| currency | java.util.Currency |
| class | java.lang.Class |
| binary | byte[] |
| text | java.lang.String |
| serializable | java.io.Serializable |
| clob | java.sql.Clob |
| blob | java.sql.Blob |
除了标准类型,你还可以创建自己的类型。用户类型类应实现 `org.hibernate.usertype.UserType` 接口或 `org.hibernate.usertype.CompositeUserType` 接口。不过,除非在应用程序中大量使用自定义类型,否则不建议这么做,因为实现起来比较麻烦。对于一次性的情况,建议使用组件,它们在映射文件中无需编写特定的 Hibernate 代码就能实现类似的行为。
## 3. 映射文件剖析
### 3.1 `<hibernate-mapping>` 元素
这是任何映射文件的根元素,其属性主要定义应用于子元素的默认行为和设置,如下表所示:
| Attribute | Values | Default | Description |
| --- | --- | --- | --- |
| auto-import | true, false | true | 默认情况下,允许在 Hibernate 查询中使用未限定的类名。通常只有在类名可能产生歧义时才将其设置为 false。 |
| catalog | | | 查询应应用的数据库目录。 |
| default-access | property | | 默认访问类型。若设置为 `property`,则使用 `get` 和 `set` 方法访问数据;若设置为 `field`,则直接访问数据。也可以提供 `PropertyAccessor` 实现类的名称来定义其他访问机制。 |
| default-cascade | | | 定义直接数据更改默认情况下如何(以及是否)影响依赖数据。 |
| default-lazy | true, false | true | 定义是否默认使用延迟实例化。一般来说,为了提高性能,应尽可能使用延迟实例化。 |
| package | | | 所有隐式导入被认为发生的包。 |
| schema | | | 查询应应用的数据库模式。 |
默认的级联模式包括 `create`、`merge`、`delete`、`save-update`、`evict`、`replicate`、`lock`、`refresh`,还有特殊选项 `all`、`delete-orphan`、`none`。
`<hibernate-mapping>` 子元素的所需顺序和基数如下:
```plaintext
(meta*,
typedef*,
import*,
(class | subclass | joined-subclass | union-subclass)*,
(query | sql-query)*,
filter-def*)
```
### 3.2 `<class>` 元素
这是最常用的子元素,用于描述 Java 对象与数据库实体之间的关系。`<class>` 元素允许定义以下属性:
| Attribute | Values | Default | Description |
| --- | --- | --- | --- |
| abstract | true, false | false | 若要映射的类是抽象类,则应设置此标志。 |
| batch-size | 1 | | 指定按标识符检索类实例时可以批量处理的项目数量。 |
| catalog | | | 查询应应用的数据库目录。 |
| check | | | 定义额外的行级检查约束,在表生成时有效地将其作为 SQL `CHECK( ... )` 子句添加。 |
| discriminator-value | | | 用于区分持久化到同一表的同一类型的相同子类的值。`is null` 和 `is not null` 是允许的值。 |
| dynamic-insert | true, false | false | 指示所有列是否应出现在 `INSERT` 语句中。若设置为 `true`,则生成的 `INSERT` 命令中不会出现空列。在非常宽的表中,这可能会提高性能,但由于 `insert` 语句会被缓存,`dynamic-insert` 很容易导致性能下降。 |
| dynamic-update | true, false | false | 指示所有列是否应出现在 `UPDATE` 语句中。若设置为 `true`,则生成的 `UPDATE` 命令中不会出现未更改的列。与 `dynamic-insert` 一样,这可以出于性能原因进行调整。若要使用基于版本的乐观锁定,则必须启用 `dynamic-update`。 |
| entity-name | | | 用于代替类名的实体名称(如果使用动态映射,则为必需项)。 |
| lazy | true, false | | 用于禁用或启用相对于封闭映射默认值的延迟获取。 |
| mutable | true, false | true | 用于标记类是不可变的(允许 Hibernate 在处理这些类时进行一些性能优化)。 |
| name | | | 要持久化的类(或接口)的完全限定 Java 名称,或者如果 `<hibernate-mapping>` 元素声明了 `package` 属性,则可以是未限定的名称。 |
| node | | | 指定 XML 关系持久化功能应使用的 XML 元素或属性的名称。 |
| optimistic-lock | none, version | version | 指定要使用的乐观锁定策略。该策略在类级别应用,但在 Hibernate 3 中也可以在属性级别指定(或覆盖)。 |
| persister | | | 允许在持久化实体时使用自定义 `ClassPersister` 对象。 |
| polymorphism | implicit, explicit | implicit | 确定如何使用多态性。默认的隐式行为是,如果查询中指定了超类或实现的接口,则返回该类的实例;如果查询中指定了类本身,则返回子类。 |
| proxy | | | 指定用作延迟初始化代理的类或接口。Hibernate 默认使用运行时生成的代理,但你可以指定自己的 `org.hibernate.HibernateProxy` 实现。 |
| rowid | | | 标记应使用行 ID(这是数据库实现细节,允许 Hibernate 优化更新)。 |
| schema | | | 可选地覆盖 `<hibernate-mapping>` 元素指定的模式。 |
| select-before-update | true, false | false | 标记 Hibernate 应进行额外工作以避免发出不必要的 `UPDATE` 语句。若设置为 `true`,Hibernate 在尝试发出 `UPDATE` 语句之前会发出 `SELECT` 语句,以确保 `UPDATE` 语句确实必要(即列已被修改)。虽然这可能效率较低,但可以防止不必要地调用数据库触发器。 |
| subselect | | | 底层表内容的子选择。类只有在不可变且只读时才能使用子选择(因为这里定义的 SQL 无法反转)。一般来说,使用数据库视图更可取。 |
| table | | | 与类关联的表名(如果未指定,则使用未限定的类名)。 |
| where | | | 从表中检索此类对象时使用的任意 SQL `where` 条件。 |
`<class>` 子元素的所需顺序和基数如下:
```plaintext
(meta*,
subselect?,
cache?,
synchronize*,
comment?,
tuplizer*,
(id | composite-id),
discriminator?,
(version | timestamp)?,
(property | many-to-one | one-to-one | component | dynamic-component |
properties | any | map | set | list | bag | idbag |
array | primitive-array)*,
((join*, subclass*) | joined-subclass* | union-subclass*),
loader?,
sql-insert?,
sql-update?,
sql-delete?,
filter*
resultset,
(query | sql-query)
)
```
### 3.3 `<id>` 元素
所有实体都需要以某种方式定义其主键。由 `<class>` 元素直接定义的任何类(非派生类或组件类)必须有 `<id>` 或 `<composite-id>` 元素来定义主键,其属性如下表所示:
| Attribute | Values | Default | Description |
| --- | --- | --- | --- |
| access | | | 定义如何访问属性:通过 `field`(直接访问)、`property`(调用 `get/set` 方法)或使用 `PropertyAccessor` 类的名称。如果未指定,则继承 `<hibernate-mapping>` 元素的值。 |
| column | | | 表中包含主键的列名。如果未指定,则使用 `name` 属性的值。 |
| length | | | 要使用的列长度。 |
| name | | | 类中表示此主键的属性名称。如果省略,则假设类没有直接表示此主键的属性。如果省略 `name` 属性,则必须提供 `column` 属性。 |
| node | | | 指定 XML 关系持久化功能应使用的
0
0
复制全文
相关推荐









