2016-01-14 38 views
0

我用@OneToOne注释了我的字段,当我检查数据库(使用liquibase生成)时,发现数据库列上存在唯一的约束。@OneToOne是否意味着唯一性?

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

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

  • 加@JoinColumn(唯一= FALSE),
  • 只使用@JoinColumn(唯一= FALSE)没有@OneToOne,
  • 或使用@ManyToOne?
  • 还是不加任何注释?

我不想在城市类中放置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; 
} 
+0

单向@ManyToOne应该工作得很好。 –

回答

1

JPA specification说,用于双向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的主键类型相同,并且其上有一个唯一键约束

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

+0

比写@OneToOne @JoinColumn(unique = false)显然是错误的? – Reek

+1

是的,这是一个矛盾 –