创建一对一的关系

让我们与另一个类创建一对一的关系。先在PhotoMetadata.ts中创建一个新类。此 PhotoMetadata 类应包含 photo 的其他元信息:

  1. import { Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn } from "typeorm";
  2. import { Photo } from "./Photo";
  3. @Entity()
  4. export class PhotoMetadata {
  5. @PrimaryGeneratedColumn()
  6. id: number;
  7. @Column("int")
  8. height: number;
  9. @Column("int")
  10. width: number;
  11. @Column()
  12. orientation: string;
  13. @Column()
  14. compressed: boolean;
  15. @Column()
  16. comment: string;
  17. @OneToOne(type => Photo)
  18. @JoinColumn()
  19. photo: Photo;
  20. }

这里我们使用了一个名为@OneToOne的新装饰器,它允许我们在两个实体之间创建一对一的关系。type => Photo是一个函数,返回我们想要与之建立关系的实体的类。由于特定于语言的关系,我们只能使用一个返回类的函数,而不是直接使用该类。同时也可以把它写成()=> Photo,但是type => Photo显得代码更有可读性。type 变量本身不包含任何内容。

我们还添加了一个@JoinColumn装饰器,表明实体键的对应关系。关系可以是单向的或双向的。但是只有一方是拥有者。在关系的所有者方面需要使用@JoinColumn 装饰器。

如果运行该应用程序,你将看到一个新生成的表,它将包含一个带有关系外键的列:

  1. +-------------+--------------+----------------------------+
  2. | photo_metadata |
  3. +-------------+--------------+----------------------------+
  4. | id | int(11) | PRIMARY KEY AUTO_INCREMENT |
  5. | height | int(11) | |
  6. | width | int(11) | |
  7. | comment | varchar(255) | |
  8. | compressed | boolean | |
  9. | orientation | varchar(255) | |
  10. | photoId | int(11) | FOREIGN KEY |
  11. +-------------+--------------+----------------------------+