### Hibernate ORM Mapping详解 #### 一、一对多与一对一映射关系 在关系型数据库中,数据间的关联可以通过一对一、一对多或者多对多的关系来建立。而在Hibernate框架中,这些关系同样可以通过XML配置文件或者注解的方式进行映射。 ##### 一对多映射关系示例 **User和Account之间的一对多映射关系** - **概念**: 在一对多的映射关系中,一个`User`可以拥有多个`Account`。 - **配置**: - **User.hbm.xml**: 配置文件中通常会使用`<set>`元素来定义`User`与`Account`之间的关系,并且通过`inverse="true"`来指定在关系维护过程中,`User`实体不负责维护这个关系,而是由`Account`实体负责。 - **Account.hbm.xml**: 对于`Account`实体,它可能会包含一个对`User`实体的引用,表示一个账户属于某个用户。 ```xml <class name="User" table="t_bank_user_sd0711"> <id name="oid" column="oid"> <generator class="increment"/> </id> <property name="name" column="name"/> <property name="userid" column="userid"/> <set name="accounts" inverse="true" cascade="all-delete-orphan"> <key column="fid"/> <one-to-many class="Account"/> </set> </class> ``` - **解释**: - `<key column="fid">`: 表示关系另一端(多端)的关联表中和本表相关的外键字段的名字是`fid`。 - `<one-to-many class="Account">`: 表示该集合中保存的持久对象的类型是`Account`。 - `inverse="true"`: 使得控制权转交给对方,意味着在关系的维护上,不是`User`实体负责,而是`Account`实体负责。 - `cascade="all-delete-orphan"`: 指示Hibernate在删除`User`实体时,也会删除所有与之关联的`Account`实体。 ##### 一对一映射关系示例 **Account和Address之间的一对一映射关系** - **概念**: 一个`Account`只对应一个`Address`。 - **配置**: - **Account.hbm.xml**: 在`Account`实体中使用`<one-to-one>`元素来映射与`Address`的关系。 - **Address.hbm.xml**: 对应地,在`Address`实体中可能也会包含对`Account`的引用。 ```xml <class name="Account" table="t_bank_act_sd0711"> <id name="oid" column="oid"> <generator class="increment"/> </id> <property name="actNo" column="actNo"/> <property name="bal" column="bal"/> <one-to-one name="address" class="Address" constrained="true"/> </class> ``` - **解释**: - `<one-to-one name="address" class="Address" constrained="true">`: 表示`Account`与`Address`之间存在一对一的关系,`constrained="true"`表明在数据库级别也实现了这种唯一性约束。 - `constrained="true"`: 保证在数据库层面实现了一对一的约束。 #### 二、数据库表创建及约束 根据提供的DDL语句,可以看出创建了三个表`t_bank_user_sd0711`, `t_bank_act_sd0711` 和 `t_bank_addr_sd0711`。其中涉及到了MySQL和Oracle两种数据库的DDL语句。 ##### MySQL DDL语句 ```sql CREATE TABLE t_bank_act_sd0711 ( oid BIGINT NOT NULL AUTO_INCREMENT, actNo VARCHAR(255) UNIQUE, bal DOUBLE PRECISION NOT NULL, fid BIGINT, PRIMARY KEY (oid) ); CREATE TABLE t_bank_addr_sd0711 ( oid BIGINT NOT NULL, zipcode VARCHAR(255) NOT NULL, city VARCHAR(255), PRIMARY KEY (oid) ); CREATE TABLE t_bank_user_sd0711 ( oid BIGINT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, userid VARCHAR(255) UNIQUE, PRIMARY KEY (oid) ); ALTER TABLE t_bank_act_sd0711 ADD INDEX FK9525809D9BA616F6 (fid), ADD CONSTRAINT FK9525809D9BA616F6 FOREIGN KEY (fid) REFERENCES t_bank_user_sd0711 (oid); ALTER TABLE t_bank_addr_sd0711 ADD INDEX FK6FB9272E13A2508D (oid), ADD CONSTRAINT FK6FB9272E13A2508D FOREIGN KEY (oid) REFERENCES t_bank_act_sd0711 (oid); ``` ##### Oracle DDL语句 ```sql CREATE TABLE t_bank_act_sd0711 ( oid NUMBER(19,0) NOT NULL, actNo VARCHAR2(255 CHAR) UNIQUE, bal DOUBLE PRECISION NOT NULL, fid NUMBER(19,0), PRIMARY KEY (oid) ); CREATE TABLE t_bank_addr_sd0711 ( oid NUMBER(19,0) NOT NULL, zipcode VARCHAR2(255 CHAR) NOT NULL, city VARCHAR2(255 CHAR), PRIMARY KEY (oid) ); CREATE TABLE t_bank_user_sd0711 ( oid NUMBER(19,0) NOT NULL, name VARCHAR2(255 CHAR) NOT NULL, userid VARCHAR2(255 CHAR) UNIQUE, PRIMARY KEY (oid) ); ALTER TABLE t_bank_act_sd0711 ADD CONSTRAINT FK9525809D9BA616F6 FOREIGN KEY (fid) REFERENCES t_bank_user_sd0711 (oid); ALTER TABLE t_bank_addr_sd0711 ADD CONSTRAINT FK6FB9272E13A2508D FOREIGN KEY (oid) REFERENCES t_bank_act_sd0711 (oid); ``` #### 三、Session操作 在使用Hibernate进行CRUD操作时,涉及到Session的操作非常重要。这里简要说明两个常见的操作: 1. **保存对象**: - `s.save(user);` 当使用`Session`保存一个对象`user`时,Hibernate会执行以下步骤: - 根据配置文件的主键生成方式,为`user`对象分配一个唯一的标识符`oid`。 - 将`user`对象纳入`Session`的内部缓存中,这个缓存通常是一个`Map`结构。 - 当事务提交时,Hibernate会清理缓存,将新的对象通过`INSERT`语句持久化到数据库中。 2. **级联操作**: - `cascade="all-delete-orphan"` 这个属性的作用是把孤儿对象删除,孤儿对象指的是与当前对象脱离关系的对象。例如,在一对多的关系中,如果从`User`实体的集合中移除一个`Account`实体,则该`Account`实体如果没有其他引用的话,将会被标记为孤儿对象。当`User`实体被更新或删除时,与之关联的所有孤儿`Account`对象也将被删除。 以上内容涵盖了基于给定的文件信息中关于Hibernate的ORM Mapping以及相关数据库操作的关键知识点。对于理解和应用Hibernate框架来说,这些知识是非常重要的基础。
- 粉丝: 2
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助