Hibernate定义@OneToOne后MySQL生成一对多关系是否正常?
关于Hibernate @OneToOne关联生成MySQL一对多关系的疑问
在使用Hibernate定义@OneToOne关联关系后,发现MySQL数据库中生成的是一对多关系(关联关系图示:
)。请问这属于错误,还是Hibernate管理一对一关系的正常方式?我甚至尝试了关联关系的典型示例,代码如下:
@Entity public class Employee { @Id private Long id; @OneToOne @JoinColumn(name = "parking_spot_id") private ParkingSpot parkingSpot; } @Entity public class ParkingSpot { @Id private Long id; }
这不是错误,是Hibernate实现一对一关联的正常表现,但数据库层面的约束需要额外配置才能严格保证一对一。
原因说明
- 当前代码仅在
Employee表中添加了parking_spot_id外键列,但默认该列没有唯一约束。数据库只知晓Employee单条记录关联ParkingSpot单条记录,却未限制多个Employee不能关联同一个ParkingSpot,因此数据库关系图示会呈现类似一对多的形态。 @OneToOne注解是在ORM层面保证一对一逻辑,若要让数据库层面也强制约束一对一关系,需给parking_spot_id列添加唯一约束。
解决方法
修改@JoinColumn注解,添加唯一约束配置:
@OneToOne @JoinColumn(name = "parking_spot_id", unique = true) private ParkingSpot parkingSpot;
这样生成的parking_spot_id列会带有唯一索引,数据库层面会严格限制一个ParkingSpot只能被一个Employee关联,此时数据库关系图示就会正确显示为一对一。
若需双向一对一关联,还可在ParkingSpot实体中添加@OneToOne(mappedBy = "parkingSpot")注解,进一步明确关联关系。
内容的提问来源于stack exchange,提问作者Michał Zając
相关产品推荐
相关产品推荐

