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

相關文章
相關標籤/搜索