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