<meta>元素的屬性
屬性 描述
class-description 指定描述類的javaDoc
field-description 指定描述類的屬性javaDoc
interface 如果為true,表明生成接口而非類,默認false
implements 指定類所實現的接口
extends 指定繼承的父類名
generated-class 重新指定生成的類名
scope-class 指定類的修飾符,默認public
scope-set 指定set方法的修飾符,默認public
scope-get 指定get方法的修飾符,默認public
scope-field 指定類的屬性的修飾符,默認private
use-in-toString 如果為true,表示在toString()方法中包含此屬性
gen-property 如果為false,不會在java類中生成此屬性,默認true
finder-method 指定find方法名
<column>元素屬性
name 設定字段名字
length 設定字段長度
not-null 如為true,指名該字段不允許為null,默認false
unique 如為true,指名該字段具有唯一約束,默認false
index 給一個或多個字段建立索引
unique-key 為多個字段設定唯一約束
foreign-key 為外鍵約束命名,在<many-to-many><one-to-one><key><many-to-one>元素中包含
foreign-key屬性,在雙向關聯中,inverse屬性為true的一端不能設置foreign-key
sql-type 設定字段sql類型
check 設定sql檢查約束
用于控制insert or update 語句的映射屬性
<property>元素的insert屬性 如為false,在insert中不包含該字段,默認為true
<property>元素的update屬性 如為false,在update中不包含該字段,默認為true
<class>元素的mutable屬性 如為false,等價于所有字段的update屬性為false,默認為true
<property>元素的dunameic-insert屬性 如為true,表明動態生成insert語句,只有不為null,才會包含insert語句中,默認false
<property>元素的dunameic-update屬性 如為true,表明動態生成update語句,只有不為null,才會包含insert語句中,默認false
<class>元素的dunameic-insert屬性 如為true,表明等價于所有字段動態生成insert語句,只有不為null,才會包含insert語句中 ,默認false
<class>元素的dunameic-update屬性 如為true,表明等價于所有字段動態生成update語句,只有不為null,才會包含insert語句中 ,默認false
Hibernate提供的內置標識符生成器
increment 適用于代理主鍵,自動遞增,增1(只能是long,int,short)
identity 適用于代理主鍵,底層數據庫自動增長字段類型(數據庫需支持,只能是long,int,short)
(oralce)sequence 適用于代理主鍵,根據底層數據庫的序列來生成標識符(數據庫支持序列,只能是long,int,short)
hilo 適用于代理主鍵,根據high/low算法來生成.Hibernate把特定表的字段作為high值,在默認情況
下選用hibernate_unique_key表的next_hi字段
(mysql,mssql)native 適用于代理主鍵,根據數據庫自動生成標識符支持能力,來選擇identity,sequence,hilo
uuid.hex 適用于代理主鍵,采用128位UUID(universal unique identification)算法來生成標識.此算法能在網絡環境中生成唯一的字符串標識符,(不建議使用,字符串類型比整形類型的主鍵占用更多的空間)
assigned 適用于自然主鍵,由java程序負責生成.
<hibernate-mapping>
<class name="項目路徑" table="庫中對應表名" schema="dbo" catalog="netoa">
<meta attribute="class-description">指定描述類的javaDoc</meta>
<meta attribute="class-scope">指名類的修飾類型</meta>
<meta attribute="extends">指定繼承類</meta>
<id name="bgrkbh" type="long">
<column name="BGRKBH" precision="15" scale="0" sql-type="庫中類型" check="BGRKBH>10"/>
<meta attribute="scope-set">指定類,類屬性的getxxx(),setxxx()方法的修飾符
包括:static,final,abstract,public,protected,private
</meta>
<generator class="assigned" />
</id>
<property name="Class.fileName" type="long">
<column name="YSLX" precision="精度" scale="刻度" not-null="默認false" sql-type="數據庫中類型"/>
附加屬性不會影響Hibernate的運行行為
<meta attribute="field-description">指定描述類的javaDoc</meta>
指定描述類屬性的javaDoc
</property>
</class>
</hibernate-mapping>
注意:
1 Session的commit()和flush()方法的區別,flush()方法進行清理緩存的操作,執行一系列的SQL語句,但不會提交事務;
commit()方法會先調用flush(),然后提交事務.提交事務意味著對數據庫所作的更新被永久保存下來.
2 Session的setFlushMode()方法用于設定清理緩存的時間點.FlushMode類定義了三種不同的清理模式
清理緩存的模式 Session的查詢方法 Session的commit()方法 Session的flush()方法
FlushMode.AUTO 清理 清理 清理
FlushMode.COMMIT 不清理 清理 清理
FlushMode.NEVER 不清理 不清理 清理
3 Hibernate應用中java對象的狀態
臨時狀態 (transient):剛剛用new語句創建,還沒被持久化,不處與Session的緩存中,處于臨時狀態的java對象被稱為臨時對象.
持久化狀態(persistent):已經被持久化,加入session的緩存中.處于持久化狀態的java對象被稱為持久化對象.
游離狀態(detached):已經被持久化,但不在處于session的緩存中.處于游離狀態的java對象被稱為游離對象.
(注意:::::)持久化類與持久化對象是不同的概念.持久化類的實例可以處于臨時狀態,持久化狀態和游離狀態.其中處于
持久化狀態的實例 被稱為持久化狀態.
臨時對象的特性:
1 不處于緩存中,也可以說,不被任何一個Session實例關聯
2 在數據中沒有對應的紀錄.
在此情況下,java對象進入臨時狀態
1 當通過new創建一個對象時,此時不和數據庫中的任何紀錄的
ex:
對象的狀態轉化過程
程序代碼 對象的生命周期 對象的狀態
tx=session.beginTransaction();
Object obj=new Object("tow",new HashSet()); 開始生命周期 臨時狀態
session.save(obj); 處于生命周期 轉化為持久狀態
Long id=obj.getId();
obj=null;
Object obj2=(Object)session.load(Object.class,id); 處于生命周期 處于持久化狀態
tx.commit();
session.close(); 處于生命周期 轉變成游離狀態
System.out.print(obj2.getName()); 處于生命周期 處于游離狀態
obj2=null; 結束生命周期 結束生命周期
4 cascade屬性
cascade屬性值 描述
none 在保存更新時,忽略其他關聯對象,他是cascade默認屬性
save-update 當通過Session的save(),update()以及saveOrUpdate()方法來保存
或更新當前對象時,及聯保存所有關聯的新建的臨時對象,并且及聯更新所有關聯的游離對象
delete 當通過session的delete()方法刪除當前對象時,及聯刪除所有對象
all 包含save-update及delete行為,此外對當前對象執行evict()或lock
()操作時,也會對所有關聯的持久化對象執行evict()或lock()操作
delete-orphan 刪除所有和當前對象解除關聯關系的對象
all-delete-orphan 包含all和delete-orphan
5 Hibernate映射類型,對應的java基本類型及對應的標準SQL類型
Hibernate 映射類型 java類型 標準SQL類型
integer或者int int INTEGER
long long BIGINT
short short SMALLINT
byte byte TINYINT
float float FLOAT
double double DOUBLE
big_decimal java.math.BigDecimal NUMERIC
character char and string CHAR
string string VARCHAR
boolean boolean BIT
Hibernate映射類型,對應的java時間和日期類型及對應的標準SQL類型
映射類型 java類型 標準SQL類型 描述
date java.util.Date或者java.sql.Date DATE 代表日期,YYYY-MM-DD
time java.util.Date或者java.sql.Date TIME 代表時間,形式為HH:MM:SS
timestamp java.util.Date或者java.sql.Timestamp TIMESTAMP 代表日期和時間,YYYYMMDDHHMMSS
calendar java.util.Calendar TIMESTAMP 同上
calendar_date java.util.Calendar DATE 代表日期,YYYY-MM-DD
6 JAVA大對象類型的Hibernate映射類型
映射類型 java類型 標準SQL類型 MYSQL類型 ORALCE類型
binary byte[] VARBINARY(或BLOB) BLOB BLOB
text string CLOB TEXT CLOB
serializable 實現Serializable VARBINARY(或BLOB) BLOB BLOB
接口任意一個java類
clob java.sql.Clob CLOB TEXT CLOB
blob java.sql.Blob BLOB BLOB BLOB
例:
a Session session=sessionFactory.openSession();
Transaction tx=session.beginTransaction();
Object obj=new Object();
obj.setFile(Hibernate.createClob(" "));
session.save(obj);
session.flush();
//鎖定這條紀錄
session.refresh(obj,LocakMode.UPGRADE);
oracle.sql.CLOB clob=(oracle.sql.CLOB)obj.getFile();
//把長文本數據放入Clob中
Writer pw=clob.getCharacterOutputStream();
pw.write(longText);//longText標識長度超過255的字符串
pw.close();
tx.commit();
session.close();
b InputStream in=this.getClass().getResourceAsStream("photo.gif");
byte[] buffer=new byte[in.available()];
in.read(buffer);
set
7 映射文件中用于設定檢索策略的幾個屬性
屬性 可選值 默認值 描述
lazy true,false false 如為true,表延遲索引,在<class><set>中包含此屬性
outer-join auto,true,false 在<many-to-one> 如為true,表迫切左外連接檢索策略,在<many-to-one>
<one-to-one> <one-to-one>和<set>元素中包含此屬性
元素為auto,在<set>
元素中為false
batch-size 正整數 1 設定批量檢索的數量,合理取值在3-10間.
僅適用于關聯級別的立即檢索和延遲檢索,在<class><set>元素中包含此屬性
caonstrained true <one-to-one>中的元素,與<many-to-one>的not null
在語義上有些相似,它表明對象之間必須關聯.
8 HQL和QBC支持的各種運算
運算比較 HQL運算符 QBC運算方法 含義
= Expression.eq() 等于
<> Expression.not(Expression.eq()) 不等于
> Expression.gt() 大于
>= Expression.ge() 大于等于
比較運算 < Expression.lt() 小于
<= Expression.le() 小于等于
is null Expression.isNull() 等于空值
is not null Expression.isNotNull() 非空值
范圍運算 in(列表) Expression.in() 等于列表中的某一值
not in(列表) Expression.not(Expression.in()) 不等于列表中的任意一值
between 值1 and 值2 Expression.between() 大于等于1并小于等于2
not between 值1 and 值2 Expression.not(Expression.between) 小于值1或者大于值2
字符串模式匹配 like Expression.like() 字符串模式匹配
邏輯運算 and Expression.and()
Expression.conjunction() 邏輯與
or Expression.or()
Expression.disjunction() 邏輯或
not Expression.not() 邏輯非
引申:Expression.eq("name","tom").ignoreCase();不區分大小寫
9 expression.MatchMode類包含的各個靜態常量實例
匹配模式 舉例
MatchMode.START Expression.like("NAME","T",MatchMode.StART)姓名以T開頭
MatchMode.END Expression.like("NAME","T",MatchMode.END)姓名以T結尾
MatchMode.ANYWHERE Expression.like("NAME","T",MatchMode.ANYWHERE)姓名包含T
MatchMode.EXACT Expression.like("NAME","Tom",MatchMode.SEXACT)姓名必須是Tom
10 ex:
Iterator it=session.createQuery("select c.name,count(c) from object").list.iterator();
while(it.hasNext()){
Object[] pair=(Object[])it.next();
String name=(String)pair[0];
Integer count=(Integer)pair[1];
}
11 集合過濾
Session的createFilter()方法用來過濾集合,它具有以下特點.
a 它返回Query類型的實例
b 它所處的對象必須處于持久化狀態
c 它的第二個參數指定過濾條件,它由合法的HQL語句組成
d 不管持久化對象的集合是否已經被初始化,Query的list方法都會執行SQL查詢語句,到數據庫中檢索關聯對象
e 如對象中的集合已被初始化,為保證Session中緩存不出現id相同的集合對象,Query的list不會在創建集合對象
僅僅返回已經存在的集合對象的引用
f 如對象中的集合對象未被初始化,Query的list()方法會創建相應的(集合名)對象,但不是初始化對象的對象集合
12 子查詢的應用
all 表示子查詢語句返回的所有紀錄
ex:返回所有訂單價格都小于100的客戶
from Customer c where 100>all(select o.price from c.orders o)
any 表示子查詢語句返回的任意一條紀錄
ex:返回一條訂單價格小于100的客戶
from Customer c where 100>any(select o.price from c.orders o)
some 與any等價
in 與=any等價
ex:返回一條訂單價格等于100的客戶
from Customer c where 100=any(select o.price from c.orders o)
from Customer c where 100=some(select o.price from c.orders o)
from Customer c where 100 in (select o.price from c.orders o)
exists 表示自查詢語句至少返回一條紀錄
ex:返回至少有一條的訂單客戶
from Customer c where exists (select c.orders)
如果子查詢語句是一個集合,可采用
from Customer c where :order in elements(c.orders)====(from c.orders)
13 HQL操縱集合的函數或屬性
size()函數或size屬性:獲得集合元素的數目
minIndex()函數或minIndex屬性:對于建立了索引的集合,獲得最小索引
maxIndex()函數或maxIndex屬性:對于建立了索引的集合,獲得最大索引
minElement()函數或minElement屬性:對于包含基本類型元素的集合,獲得集合中取值最小的元素
maxElement()函數或maxElement屬性:對于包含基本類型元素的集合,獲得集合中取值最大的元素
elements()函數:獲得集合中的所有元素
ex:from Customer c where c.orders.size>0 or from Customer c where size(c.orders)>0
14 在映射文件中配置SQL語句
<sql-query name="findCustomerAndOrders"><![CDATA[
select {c.*},{o.*} from CUSTOMERS c inner join ORDERS o where C.ID=o.CUSTOMER_ID]]>
<return alias="c" class="Customer"/>
<return alias="o" class="Order"/>
</sql>
比較HQL與QBC的優缺點
比較方面 HQL檢索方式 QBC檢索方式
可讀性 優點:和SQL查詢語句較接近,易讀 肢解成Criterion實例,可讀性差
功能 優點:功能最強大,支持各類查詢 不支持報表查詢,子查詢,連接查詢也受限
查詢語句形式 缺點:應用程序必須提供基于字符串的HQL語句 優點:提供了更加面向對象的接口
何時被解析 缺點:HQL只有在運行時才被解析 優點:更易排錯
可擴展性 缺點:不具有擴展性 優點:允許用戶擴展Criterion接口
對動態查詢語句的支持 缺點:支持動態語句但編成麻煩 優點:適合生成動態查詢
15 Hibernate中的事務
session.disconnect(); 釋放數據庫連接
session.reconnect(); 重新獲得數據庫連接
對于同時運行的多個事務,當這些事務訪問數據庫中相同的數據時,如果沒有采取必要的隔離機制,就會導致各類問題并發.可歸納為以下幾類
a 第一類丟失更新:撤銷一個事務時,把其他事務已提交的更新覆蓋.
b 臟讀:一個事務讀到另一事務未提交的更新數據
c 虛讀:一個事務讀到另一事務已提交的新插入的數據
d 不可重復讀:一個事務讀到另一事務以提交的更新數據
e 第二類丟失更新:這是不可重讀中的特例,一個事務覆蓋另一事務已提交的更新數據.