如下例子:
import com
.xing
.hibernate_hql_xml.entity
.student
;import com
.xing
.util
.hibernateutil
;import org.hibernate
.session
;import org.junit
.test
;/**
* created by administrator on 2016/8/4.
*/public class testfetch catch (exception e) finally }}
上面例子中的**:在用hbm.xml配置檔案配置的專案中執行,會產生如下3條sql語句,但是同樣的**在基於「annotation」配置的專案中執行,只產生一條sql語句
hbm.xml配置的專案
as id1_2_0_, student0_.name
as name2_2_0_, student0_.*** as ***3_2_0_, student0_.cid as cid4_2_0_ from t_student student0_ where student0_.id=?
hibernate: select classroom0_.id
as id1_0_0_, classroom0_.name
as name2_0_0_, classroom0_.grade as grade3_0_0_, classroom0_.sp_id as sp_id4_0_0_ from t_class_room classroom0_ where classroom0_.id=?
hibernate: select special0_.id
as id1_1_0_, special0_.name
as name2_1_0_, special0_.type as type3_1_0_ from t_special special0_ where special0_.id=?
預設情況會生成三條sql語句,每條sql都獲取自己對應的資訊,實際上只要關聯錶用一條sql就能獲取上面的資訊了,那麼解決這個問題的辦法:在student.hbm.xml中設定fetch用它來抓classroom,然後在classroom中同樣設定fetch來抓special。
<?xml version="1.0"?>
package="com.xing.hibernate_hql_xml.entity">
name="student"
table="t_student" >
name="id">
class="native"/>
id>
name="name"/>
name="***"/>
name="classroom"
column="cid"
fetch="join"/>
class>
設定完之後執行如下:
設定完之後再執行上面的**就會自動生成帶有join的sql語句,但是這樣設定有會出現新的問題。
如果現在不去學生的班級資訊和專業資訊了,只是想獲取學生資訊,而由於剛才設定了「fetch」,所以它查詢學生資訊的時候也會去關聯班級和專業的表資訊:
(如下sql顯示)
as id1_2_2_, student0_.name
as name2_2_2_, student0_.*** as ***3_2_2_, student0_.cid as cid4_2_2_, classroom1_.id
as id1_0_0_, classroom1_.name
as name2_0_0_, classroom1_.grade as grade3_0_0_, classroom1_.sp_id as sp_id4_0_0_, special2_.id
as id1_1_1_, special2_.name
as name2_1_1_, special2_.type as type3_1_1_ from t_student student0_ left outer join t_class_room classroom1_ on
student0_.cid=classroom1_.id left outer join t_special special2_ on
classroom1_.sp_id=special2_.id
where student0_.id=?
姓名:石明
上面這種情況就會影響到效率
當設定了fetch,延遲載入就失效了。
而基於annotation的配置沒有延遲載入,他在獲取資料時會將所有有關聯物件的資訊都查詢出來,例子中基於annotation的配置預設就會建立對應的帶有join的sql語句,也就生成一條sql語句。但是基於annotation配置當只是獲取學生資訊的時候會查學生的資訊,然後將班級的資訊也查出來。
在xml配置了「fetch=join」僅僅只對load的物件有用,而對hql中查詢的物件沒用,所以此時會發出查詢關聯物件的sql。
解決方案:
1:設定物件抓取的batch-size,加入在classroom中設定「batch-size=20」意思就是每次獲取班級資訊的時候每次都取20條。(但是這些抓取的資訊都是儲存在session中的,當session關閉的時候這些資訊也就沒有了)
2:在hql語句用「join fetch」,它的作用是用來指定抓取的。
使用join fetch的時候就不能使用count(*)了
Hibernate註解整理筆記
常用註解 temporal temporaltype.date 指定日期時間的型別 transient 指定屬性不需要對映 batch 批量操作 指定主鍵並自增 1 generatedvalue strategy generationtype.sequence,generator gen seque...
hibernate錯誤整理
解決辦法 1檢查實體類是否有預設的無參建構函式 2.匯入相關的jar包 hibernate entitymanager 4.3.11.final.jar,hibernate jpamodelgen 4.3.11.final.jar 3.查詢你的實體類的型別是否與hbm.xml 的型別相符合 4.查詢...
Hibernate筆記整理 一對一
hibernate 一對一關聯有兩種關聯方式,即 主鍵關聯和外來鍵關聯。member類 public class member idcard類 public class idcard 先對這兩個類解釋一下,member類代表人員,idcard類代表了身份證,這在現實中也是一對一的關係。1 主鍵關聯 ...