hibernate详解(三)----->>组件映射(二)之复合主键
3、组件类作为持久化类的对象标识符属性
这种情况主要是针对已经数据库表建模时,由于数据库表中采用联合自然主键(复合自然主键),为了完成这种映射需求,Hibernate使用组件类把它映射成持久化类的对象标识符。
Hibernate要求,作为复合对象标识符类的UserOid类必须实现Java.io.Serializable,且要用作为复合标识符的属性重写hashCode()方法和equlas()方法。
User.java
package com.zxf.domain;
/** 用户持久化类(实体类) */
public class User {
private UserOid id; //对象标识符(OID)
private String description; //描述
public User(){} //无参数的构造方法
//以下省略所有属性的getters和setters方法...
}
UserOid .java
package com.zxf.domain;
/** 用户类的对象标识符类
* 必须实现Serializable和重写hashCode()和equals()方法
*/
public class UserOid implements java.io.Serializable {
private static final long serialVersionUID = -9079299317576122433L;
private String firstName; //名
private String lastName; //姓
public UserOid(){} //无参数的构造方法
//用fristName、lastName重写hashCode方法
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((firstName == null) ? 0 :
firstName.hashCode());
result = prime * result + ((lastName == null) ? 0 :
lastName.hashCode());
return result;
}
//用fristName、lastName重写equals方法
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
UserOid other = (UserOid) obj;
if (firstName == null) {
if (other.firstName != null) return false;
} else if (!firstName.equals(other.firstName)) return false;
if (lastName == null) {
if (other.lastName != null) return false;
} else if (!lastName.equals(other.lastName)) return false;
return true;
}
//以下省略所有属性的getters和setters方法...
}
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 映射持久化类 -->
<class name="com.zxf.domain.User" table="user">
<!--
composite-id元素映射复合对象标识符
name属性:指定属性名
class属性:指定对应的此属性的类类型
-->
<composite-id name="id" class="com.zxf.domain.UserOid">
<!-- key-property元素映射组件类的的每个属性 -->
<key-property name="firstName" column="first_name"/>
<key-property name="lastName" column="last_name"/>
</composite-id>
<!-- 用property映射每个普通属性 -->
<property name="description"/>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库方言设置 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLInnoDBDialect
</property>
<!-- 数据库连接参数设置 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property
name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<!--实际操作数据库时是否显示SQL -->
<!--
<property name="hibernate.show_sql">true</property>-->
<property name="hibernate.format_sql">true</property>
<!--将数据库schema的DDL导出到数据库 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 以下定义实体类与数据库表的映像文件 -->
<mapping resource="com/zxf/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
分享到:
相关推荐
6.5.2 映射复合自然主键 6.6 小结 6.7 思考题 第7章 映射一对多关联关系 7.1 建立多对一的单向关联关系 7.1.1 元素的not-null属性 7.1.2 级联保存和更新 7.2 映射一对多双向关联关系 7.2.1 元素的...
- **Ehcache.jar:** 第三方缓存组件,用于实现Hibernate的一级缓存和二级缓存。 - **Hibernate3.jar:** Hibernate核心库,包含所有主要的Hibernate功能。 - **Jta.jar:** Java Transaction API,用于处理事务。 - **...
5. **Hibernate_Component**:这部分可能包含了Hibernate组件映射的示例。组件是对象的一部分,可以被嵌入到其他对象中,类似于数据库中的复合类型。通过@Component或@Embeddable注解,可以将一个类声明为组件,并在...
- **composite-id**:处理复合主键。 - **鉴别器**:在多态映射中区分子类。 - **版本**:支持乐观锁机制。 - **timestamp**:自动更新时间戳字段。 - **Property**:映射实体类的属性。 - **多对一**、**一对一**、...
### Hibernate对象关系详解 #### 一、单一关联(一对一) **定义** 一对一关联是指数据库中的两个表通过主键或外键的方式直接关联起来的一种关系。 **场景** 假设我们有两个类`Foo`和`Bar`,其中`Foo`有一个属性...
- **composite-id**:复合主键的映射方式。 - **鉴别器**:用于区分不同子类的字段。 - **版本**:用于乐观锁的版本号字段。 - **timestamp**:用于记录实体更新时间的时间戳字段。 - **Property**:实体类中的普通...
- **composite-id**:定义复合主键的映射。 - **鉴别器(discriminator)**:配置鉴别器来支持继承。 - **版本(version)**:配置版本字段以支持并发控制。 - **timestamp**:使用时间戳字段来支持并发控制。 - **...
- **复合组件映射**: - 支持将 Java 对象中的嵌套对象映射到数据库表中的一行或多行。 - 示例配置: ```xml <class name="Address"> <property name="street" column="STREET" /> ...
6. **Composite Primary Key**:复合主键,用于标识表中的记录,当单一字段不足以唯一标识一条记录时使用。 **SessionFactory的作用**: - **创建Session实例**:SessionFactory负责创建Session实例,并管理这些...
- **映射复合主键与外键**:利用`@EmbeddedId`和`@MapsId`注解来实现。 - **映射二级表(secondary tables)**:使用`@SecondaryTables`注解来指定多个二级表。 - **映射查询**: - **EJBQL/HQL查询**:使用`@...
6.5.2 映射复合自然主键 6.6 小结 6.7 思考题 第7章 映射一对多关联关系 7.1 建立多对一的单向关联关系 7.1.1 元素的not-null属性 7.1.2 级联保存和更新 7.2 映射一对多双向关联关系 7.2.1 元素的...
6.5.2 映射复合自然主键 6.6 小结 6.7 思考题 第7章 映射一对多关联关系 7.1 建立多对一的单向关联关系 7.1.1 元素的not-null属性 7.1.2 级联保存和更新 7.2 映射一对多双向关联关系 7.2.1 元素的...
6.5.2 映射复合自然主键 6.6 小结 6.7 思考题 第7章 映射一对多关联关系 7.1 建立多对一的单向关联关系 7.1.1 元素的not-null属性 7.1.2 级联保存和更新 7.2 映射一对多双向关联关系 7.2.1 元素的...
Hibernate支持多种内置的数据类型映射,包括基本类型如Integer、String、Date等,也支持复合类型的映射。 #### Hibernate内置标识符生成器 标识符生成器负责生成实体对象的主键值。Hibernate提供了多种内置的标识符...