@OneToOne是否暗示唯一性?

时间:2016-01-14 12:07:22

标签: jpa liquibase

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

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

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

  • 添加@JoinColumn(unique = false),
  • 仅使用@JoinColumn(unique = false)而不使用@oneToOne,
  • 或使用@ManyToOne?
  • 或者没有任何注释?

我不想在城市课堂上放置一个建筑物场,因为我不会打电话给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;
}

1 个答案:

答案 0 :(得分:3)

JPA specification表示对于双向OneToOne关系( 2.10.1双向OneToOne关系):

  

假设:

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

以下映射默认值适用:

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

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

  

以下映射默认值适用:

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

如果您有城市建设关系,那么对于任何合理的城市,它将是OneToMany / ManyToOne关系,因为给定城市可以有多个建筑物,但是给定建筑物只能在一个城市。