Spring JPA 实体映射的坑

举例: House 和 User 一对一映射的话,在User对象中这样设置,java

@OneToOne
@JoinColumn(name = "house_id")
@NotFound(action = NotFoundAction.IGNORE)
private House house;

当这我的是流浪汉,没有房子。进行插入这条表数据的时候,t_user表中的house_id可设为null。反之house_id not null 的话,我设置了默认值为0,此时无对应的house数据spa

JPA进行Dao.save(user); insert操做,user.setHouse(new House( id:0L)), 能够insert成功,此时house_id字段值为默认值 0code

当user.id 不可为null,进行修改操做时,设置user.house.id = 0,且无t_house中对应的数据,此时,update操做会把house_id值 更新为null, 从而可能致使报错对象

解决方法:io

进行主键关联的字段可能未空时,不建议在Spring JPA 实体中进行映射,增改操做繁杂,修改正常写法table

@Column(name = "house_id")
private Long house_id;

更优的解决方案:class

@OneToOne
@JoinColumn(name="house_id", insertable=false, updateable=false)
@NotFound(action = NotFoundAction.IGNORE)
private House house;

@Column(name = "house_id")
private Long house_id;

这样,只在查的时候使用OneToOne映射,新增修改操做,使用house_id , 这样比较灵活,方便date

相关文章
相关标签/搜索