整理筆記 Hibernate的抓取

2021-07-16 04:30:54 字數 2873 閱讀 1508

如下例子:

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 主鍵關聯 ...