Spring JPA中外键反向映射:如何在Owner实体中关联Cat?
问题描述
现有两张数据库表:
- Cat表:包含
Id、Name、Owner_Id字段 - Owner表:包含
Id、Name字段
对应的Spring JPA实体类代码如下(存在拼写错误):
@Entity @Table(name="cat") class Cat { @Id private Long id; private Sting Name; @JoinColumn(name = "owner_id") @OneToOne private Onwner owner; } @Entity @Table(name="owner") class Owner { @Id private Long id; private Sting Name; }
目前查询Cat时可获取对应的Owner对象,现询问:能否在Owner实体中添加Cat字段(如下所示),使得查询Owner时也能获取对应的Cat对象?
class Owner { @Id private Long id; private Sting Name; private Cat cat; /// Like this }
可以实现,但需要正确配置双向一对一关联
直接加private Cat cat;字段无法生效,必须配合JPA的双向关联注解,同时修正原代码里的拼写错误,具体操作如下:
1. 先修正原实体类的拼写错误
原代码里有两处明显拼写错误:
Sting→StringOnwner→Owner
另外建议字段名遵循Java驼峰命名规范(把Name改成name,非强制但更符合编码习惯)
修正后的Cat实体:
@Entity @Table(name="cat") class Cat { @Id private Long id; private String name; @JoinColumn(name = "owner_id") @OneToOne private Owner owner; // 请补充getter、setter方法及必要的构造方法 }
2. 配置Owner实体的双向关联
在Owner实体中添加Cat字段时,需要用@OneToOne注解并指定mappedBy属性,指向Cat实体中维护关联关系的owner字段(因为外键owner_id存放在Cat表,所以关联关系由Cat侧维护)。
修正并配置后的Owner实体:
@Entity @Table(name="owner") class Owner { @Id private Long id; private String name; // 双向一对一关联,指定由Cat的owner字段维护关系 @OneToOne(mappedBy = "owner") private Cat cat; // 请补充getter、setter方法及必要的构造方法 }
额外说明
- 如果不想每次查询Owner都自动加载Cat对象(避免不必要的性能消耗),可以添加懒加载配置:
@OneToOne(mappedBy = "owner", fetch = FetchType.LAZY) private Cat cat; - 要确保业务逻辑上是严格的一对一关系(一个Owner对应一个Cat),否则数据库数据可能出现关联混乱的情况。
内容的提问来源于stack exchange,提问作者javaDeveloper
相关产品推荐
相关产品推荐

