举例: 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