jpa使用manyToOne(opntional=true)踩過的坑及解決

jpa使用manyToOne(opntional=true)踩坑

@ManyToOne用於一對多的情況

(默認情況下是懶加載的,沒必要去配置哦)如:一個account可以對應多個accountPrivilege

@Entity
@Table(name = ACCOUNT_PRIVILEGE)
 
public class AccountPrivilege extends EntityId {
    // 賬號
    @ManyToOne(optional = false)
    @JoinColumn(name = ACCOUNT_PRIVILEGE_ACCOUNT, nullable = false)
    private Account account;
}

但是加上@ManyToOne(optional=false)出現瞭一些問題。

jpa將數據庫那個字段默認置為0,在查詢時,數據庫找不到account.id=0的記錄!!

通過查閱一些資料,發現:

optional屬性是定義該關聯類是否必須存在,值為false 時,關聯類雙方都必須存在,如果關系被維護端不存在,查詢的結果為null。

值為true 時, 關系被維護端可以不存在,查詢的結果仍然會返回關系維護端,在關系維護端中指向關系被維護端的屬性為null。optional屬性的默認值是true。

optional 屬性實際上指定關聯類與被關聯類的join 查詢關系,如optional=false 時join 查詢關系為inner join, optional=true 時join 查詢關系為left join。

在我們不保證該字段關聯的記錄一定存在的情況下,使用@ManyToOne或@ManyToOne(optional=true)是比較方便的。

在我把@ManyToOne(optional=false)改為@ManyToOne後,jpa將數據庫那個字段默認置為null。

@manytoone設置為optional=true不起作用

@manytoone

optional屬性的默認值是true。

optional 屬性實際上指定關聯類與被關聯類的join 查詢關系,如optional=false 時join 查詢關系為inner join, optional=true 時join 查詢關系為left join。

但是實際運行中,語句一直為innerjoin 設置為optional=true不起作用

原因

dc.createAlias(“org”, “org”); 本來寫在User user = UserUtils.getUser(); 下面,如果去掉則是正確的

public Page<Site> find(Page<Site> page, Site siteMain) {
DetachedCriteria dc = siteMainDao.createDetachedCriteria();
// 判斷是否是主站、超級管理員
User user = UserUtils.getUser();
return siteMainDao.find(page, dc);
}

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: