Spring Data JPA中mappedBy关联失效,person_id为null求助
问题:双向关联中CellPhone的person_id字段为null
我在Spring Data JPA中尝试使用mappedBy建立Person与CellPhone两个实体的双向关联(据我目前的理解,mappedBy用于标记双向关联,由非拥有方指向拥有方的关联属性)。
实体代码
@Entity @Table(name = "person") public class Person { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; private String firstname; private String lastname; @OneToMany(mappedBy="person", cascade = CascadeType.ALL) private List<CellPhone> cells; //getters and setters public void addCell(CellPhone cell) { if (this.cells == null){ cells = new ArrayList<>(); } this.cells.add(cell); } } @Entity @Table(name = "cellphone") public class CellPhone { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long id; private String brand; @ManyToOne(cascade = CascadeType.ALL) private Person person; }
测试代码
Person per = new Person(); per.setFirstName("arnulfo"); per.setLastName("gutierrez"); CellPhone cell1 = new CellPhone(); cell1.setBrand("sasomo"); CellPhone cell2 = new CellPhone(); cell2.setBrand("ni me asomo"); per.addCell(cell1); per.addCell(cell2); repo.save(per);
控制台SQL语句
Hibernate: insert into person (firstname, lastname) values (?, ?) Hibernate: insert into cellphone (brand, person_id) values (?, ?) Hibernate: insert into cellphone (brand, person_id) values (?, ?)
查询结果
mysql> select * from cellphone; +----+-------------+-----------+ | id | brand | person_id | +----+-------------+-----------+ | 1 | sasomo | NULL | | 2 | ni me asomo | NULL | +----+-------------+-----------+
请问出现该问题的原因是什么?
原因分析与解决方案
问题原因
在JPA的双向关联中,@ManyToOne所在的CellPhone实体是关联的拥有方,数据库中外键字段person_id的更新由拥有方的person属性控制。你只维护了非拥有方(Person的cells列表)的关联关系,却没有设置拥有方(CellPhone的person属性)指向对应的Person对象,导致Hibernate无法填充person_id的值。
修复方案
修改Person类中的addCell方法,在将CellPhone添加到列表的同时,设置CellPhone的person属性为当前Person实例:
public void addCell(CellPhone cell) { if (this.cells == null){ cells = new ArrayList<>(); } this.cells.add(cell); // 关键:维护拥有方的关联关系 cell.setPerson(this); }
双向关联需要同时维护双方的关系,这样才能保证数据库中的外键字段被正确更新。mappedBy只是标记了非拥有方,告知JPA不需要在非拥有方维护外键,实际的外键更新逻辑仍由拥有方负责。
内容的提问来源于stack exchange,提问作者cristian porrety
相关产品推荐
相关产品推荐

