8.1 Hibernate:一对一关联映射

来源:互联网 发布:网络银行联盟 编辑:程序博客网 时间:2024/05/20 20:44

一对一关联映射(@OneToOne)既可以是单向关联,也可以是双向关联。

单向关联遵循关系型数据库外键语义。

单向关联由外键所在表映射对象维护级联关系,双向关联使用 @OneToOnemappedBy 属性。

建立一对一应用场景

以手机为例,一部手机包含非常多的属性,如:
IMEI(International Mobile Equipment Identity,国际移动设备身份码)、手机号、型号、厂商、操作系统、版本等等。

在某些应用场景下不需要取出手机全部信息,只需要部分关键信息,基于这种场景可以将手机信息分别存储于两张表中:

  • phone:存储手机关键信息,如 IMEI、手机号等

  • phone_detail:存储更多更详细的属性,如厂商、型号、操作系统等

使用 MySQL 数据库:

CREATE TABLE `test`.`phone` (  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增长主键',  `imei` VARCHAR(15) NOT NULL,  `number` VARCHAR(11) NOT NULL COMMENT '手机号',  PRIMARY KEY (`id`),  UNIQUE INDEX `id_UNIQUE` (`id` ASC),  UNIQUE INDEX `imei_UNIQUE` (`imei` ASC),  UNIQUE INDEX `number_UNIQUE` (`number` ASC))ENGINE = InnoDBDEFAULT CHARACTER SET = utf8COMMENT = '存放手机关键信息';
CREATE TABLE `test`.`phone_detail` (  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增长主键',  `phone_id` INT UNSIGNED NOT NULL COMMENT '关联phone表的外键',  `manufacturer` VARCHAR(64) NULL COMMENT '制造商',  `model` VARCHAR(64) NULL COMMENT '型号',  PRIMARY KEY (`id`),  UNIQUE INDEX `id_UNIQUE` (`id` ASC),  INDEX `FK_PHONE_DETAIL_idx` (`phone_id` ASC),  CONSTRAINT `FK_PHONE_DETAIL`    FOREIGN KEY (`phone_id`)    REFERENCES `test`.`phone` (`id`)    ON DELETE NO ACTION    ON UPDATE NO ACTION)ENGINE = InnoDBDEFAULT CHARACTER SET = utf8COMMENT = '存放更多的手机详细信息';

8.1.1 Hibernate:一对一单向关联(unidirectional)

8.1.2 Hibernate:一对一双向关联(bidirectional)