【Hibernate學習】 —— 抓取策略(註解方式),hibernate抓取
當應用程式需要在關聯關係間進行導航的時候,hibernate如何擷取關聯對象的策略。
抓取策略的方式:
FetchType.LAZY:懶載入,載入一個實體時,定義懶載入的屬性不會馬上從資料庫中載入。
FetchType.EAGER:急載入,載入一個實體時,定義急載入的屬性會立即從資料庫中載入。
在項目中的體現,我這裡有兩個實體,一個放基礎資料的實體,另一個是放操作記錄的實體。這兩個實體的關係是一對一關聯性,因此要把基礎資料中的主鍵放在操作記錄中作為外鍵,查詢的時候查詢操作記錄表順便把基礎資料表相關資訊帶出來:
這裡用的是註解的方式:
private Company company;@OneToOne(fetch=FetchType.EAGER)@JoinColumn(name="company_id")publicCompany getCompany() {returncompany;}publicvoid setCompany(Company company) {this.company= company;}
抓取策略的體現:fetch=FetchType.EAGER,這裡我們查詢後要立馬顯示出來,故選用了急載入。
這裡遇到了一個問題:
Could not determinetype for: com.tgb.xyb.entity.Company, at table: OperateRecord, for columns:[org.hibernate.mapping.Column(company)]
解決方案:註解放在get方法上面(註:原來把註解放在了方法上)
是因為get方法是外部擷取類內部屬性的方法,所以凡是需要擷取屬性或者對象的都是在get方法上聲明的。例如Spring的依賴注入,也是從get方法去注入。
現在用了抓取策略的好處是,我們只需要把這個策略加上,那麼相應的實體就會關聯上。我們就不需要去寫相應的HQL語句去關聯或者是建立一個實體把這兩個實體關聯起來。
Hibernate的抓取策略?有那兩種定義方式?
1. Fetch.EAGER 立刻抓取,同時可以設定抓取的層次
2. Fetch.LAZY懶抓取
hibernate註解實體主鍵建置原則
首先,你要定義你所使用的Generator,如
@GenericGenerator(name = "idGenerator", strategy = "uuid")
然後才可以使用引用的方式來引用你定義好的Generator,如
@GeneratedValue(generator = "idGenerator")