@OneToOne 是否意味着唯一性?

uyl*_*lmz 2 jpa liquibase

我只用 @OneToOne 注释了我的字段,当我检查数据库(使用 liquibase 生成)时,发现数据库列有唯一的约束。

这是否意味着@OneToOne 本身就暗示了唯一性,例如。一个建筑只能在一个城市,其他建筑不能在同一个城市?

当我想告诉同一个城市可能还有其他建筑物时,我该怎么办?

  • 添加@JoinColumn(unique = false),
  • 只使用 @JoinColumn(unique = false) 而不使用 @oneToOne,
  • 或使用@ManyToOne?
  • 还是不加任何注释?

我不想在 city 类中放置一个 Buildings 字段,因为我永远不会调用 city.getBuildings();。以下任何一项是否需要双向参考?

class Building {
    @OneToOne(optional = false)
    City city;
}

class Building {
    @OneToOne(optional = false)
    @JoinColumn(unique = false)
    City city;
}

class Building {
    @JoinColumn(unique = true)
    City city;
}

class Building {
    @ManyToOne
    City city;
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*lik 5

JPA规范认为,对于一个双向OneToOne关系(2.10.1双向OneToOne关系):

假如说:

  • 实体 A 引用实体 B 的单个实例。
  • 实体 B 引用实体 A 的单个实例。
  • 实体 A 被指定为关系的所有者。

以下映射默认值适用:

  • 实体 A 映射到名为 A 的表。
  • 实体 B 映射到名为 B 的表。
  • 表 A 包含表 B 的外键。[...]外键列与表 B 的主键类型相同,并且有一个唯一键约束

如果是单向 OneToOne 关系(2.10.3.1 单向 OneToOne 关系):

以下映射默认值适用:

  • 实体 A 映射到名为 A 的表。
  • 实体 B 映射到名为 B 的表。
  • 表 A 包含表 B 的外键。[...]外键列与表 B 的主键类型相同,并且有一个唯一键约束

如果您有城市-建筑关系,那么对于任何合理的城市来说,它都是一对多/多对一关系,因为给定的城市可以有多个建筑,但给定的建筑只能在一个城市中。

  • 是的,这是矛盾的 (4认同)
  • 比写 @OneToOne @JoinColumn(unique = false) 是完全错误的吗? (2认同)