欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

8.1 Hibernate:一对一关联映射

程序员文章站 2022-04-16 08:53:01
...

一对一关联映射(@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 = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = '存放手机关键信息';
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 = InnoDB
DEFAULT CHARACTER SET = utf8
COMMENT = '存放更多的手机详细信息';

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

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