我只用@OneToOne注释了我的字段,当我检查数据库(使用likibase生成)时,发现数据库列上有唯一的约束。
这是否意味着@OneToOne本身就意味着独特性,例如一栋建筑只能在一个城市,而其他建筑不能在同一个城市?
当我想告诉别人同一个城市可能还有其他建筑时,我该怎么办?
- 添加@JoinColumn(unique=false)
- 只使用@JoinColumn(unique=false)而不使用@oneToOne
- 或者使用@ManyToOne
- 还是不加任何注释
我不想把Buildings字段放在city类中,因为我永远不会调用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;
}
JPA规范规定,对于双向OneToOne关系(2.10.1双向OneToOneRelationships):
假设:
- 实体A引用实体B的单个实例
- 实体B引用实体a的单个实例
- 实体A被指定为关系的所有者
以下映射默认值适用:
- 实体A映射到名为A的表
- 实体B被映射到名为B的表
- 表A包含表B的外键。[…]外键列的类型与表B的主键相同,并且有一个唯一键约束
在单向一对一关系的情况下(2.10.3.1单向一对二关系):
以下映射默认值适用:
- 实体A映射到名为A的表
- 实体B被映射到名为B的表
- 表A包含表B的外键。[…]外键列的类型与表B的主键相同,并且有一个唯一键约束
如果你有城市建筑关系,那么对于任何合理的城市来说,这都是一对多/多对一的关系,因为给定的城市可以有多个建筑,但给定的建筑只能在一个城市。