(1)name:屬性名。
(2)column(可選):外鍵字段的名稱。也能夠經過嵌套的 <column> 指定。
(3)class(可選 — 默認是經過反射獲得的屬性類型):被關聯的類的名字。
(4)cascade(級聯)(可選)代表操做是否從父對象級聯到被關聯的對象。
(5)fetch(可選 — 默認爲 select):在外鏈接抓取和序列選擇抓取二者中選擇其一。
(6)update, insert(可選 — 默認爲 true)指定對應的字段是否包含在用於 UPDATE 和/或 INSERT的 SQL 語句中。若是兩者都是false,則這是一個純粹的 「外源性(derived)」關聯,它的值是經過
映射到同一個(或多個)字段的某些其餘屬性獲得 或者經過 trigger(觸發器)、或其餘程序生成。
(7)property-ref:(可選)被關聯到此外鍵的類中的對應屬性的名字。若是不指定,使用被關聯類的主鍵
(8)access(可選 — 默認爲 property):Hibernate 用來訪問屬性值的策略。
(9)unique(可選):使用 DDL 爲外鍵字段生成一個惟一約束。此外, 這也能夠用做 propertyref的目標屬性。這使關聯同時具備一對一的效果。
(10)not-null(可選):使用 DDL 爲外鍵字段生成一個非空約束。
(11)optimistic-lock(可選 — 默認爲 true):指定這個屬性在作更新時是否須要得到樂觀鎖定。換句話說,它決定這個屬性發生髒數據時版本(version)的值是否增加。
(12)lazy(可選 — 默認爲 proxy):默認狀況下,單點關聯是通過代理的。lazy="no-proxy" 指定此屬性應該在實例變量第一次被訪問時應該延遲抓取(fetche lazily)(須要運行時字節碼的加強)。lazy="false" 指定此關聯老是被預先抓取。
(13)not-found(可選 - 默認爲exception):指定如何處理引用缺失行的外鍵:ignore 會把缺失的行做爲一個空關聯處理。
(14)entity-name(可選):被關聯的類的實體名。
(15)formula(可選):SQL 表達式,用於定義 computed(計算出的)外鍵值。
one-to-many
經過 one-to-many 元素,能夠定義一種常見的與另外一個持久化類的一對多關聯。
java代碼:
<one-to-many
class="ClassName"(1)
not-found="ignore|exception"(2)
entity-name="EntityName"(3)
/>
(1)class(必需):被關聯類的名稱。
(2)not-found(可選 - 默認爲exception):指明若緩存的標示值關聯的行缺失,該如何處理:ignore 會把缺失的行做爲一個空關聯處理。
(3)entity-name(可選):被關聯的類的實體名,做爲 class 的替代。
注意:<one-to-many> 元素不須要定義任何字段。也不須要指定表名。
仍是用示例來看,下面做一個雙向一對多的關係示例:
1:新建一個Parent對象和Child對象,Parent對象裏面有一個Child對象的集合,Child對象裏面有一個對Parent對象的引用,以下:
java代碼:
public class Parent{
private String id;
private String name;
private Set children = new HashSet();
……
}
public class Child {
private String uuid;
private String address;
private String postCode;
private Parent parent;
……
}
Parent.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.javass.h3.parentchild.Parent" table="tbl_parent" dynamic-update="true" dynamic-insert="true" lazy="true">
<id name="id" column="uuid" type="java.lang.String" unsaved-value="any">
<generator class="assigned"> </generator>
</id>
<property name="name" update="true" insert="true"/>
<set name="children" inverse="true" cascade="all">
<key column="tbl_parent_fk"/>
<one-to-many class="cn.javass.h3.parentchild.Child"/>
</set>
</class>
</hibernate-mapping>
Child.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.javass.h3.parentchild.Child" table="tbl_child" dynamic-update="true" dynamic-insert="true" lazy="true">
<id name="uuid" column="uuid" type="java.lang.String" unsaved-value="any">
<generator class="assigned"> </generator>
</id>
<property name="address" update="true" insert="true"/>
<property name="postCode" update="true" insert="true"/>
<many-to-one
name="parent"
column="tbl_Parent_fk"
class="cn.javass.h3.parentchild.Parent"
not-null="true"
/>
</class>
</hibernate-mapping>
客戶端測試TestMR.java文件太長,直接看演示好了。
在這個測試裏面分別演示了單獨的操做和級聯的操做。
inverse:指定由哪一方來維護雙方的關聯關係,默認是false,也就是雙方都維護,主要用在一對多 和 多對多中。
在一對多中使用inverse的時候,一般是在」一」這一端設置inverse=true,他的意思就是由多的那一端去維護關係,非反向端用於把內存中的表示保存到數據庫中。以下:
Parent p = new Parent();
Child c = new Child();
c.setParent(p); //維護父子之間關係
p.getChildren().add(c);
ninverse還有一個重要特色就是會優化Sql
ncascade:定義對象的級聯關係
all : 全部狀況下均進行關聯操做
none:全部狀況下均不進行關聯操做。這是默認值
save-update:在執行save/update/saveOrUpdate時進行關聯操做
delete:在執行delete時進行關聯操做
簡單的示範一下雙向的一對一
雙向一對一的操做是相似於雙向一對多的,只是配置上有一些不一樣:
1:Parent裏面的配置,示例以下:
<one-to-one name=
「cc」 class=
「cn.javass.h3.parentchild.Child」cascade=
「all」 property-ref=
「parent「/>這裏的property-ref參照的是Child對象裏面的屬性。
2:Child裏面的配置,不是使用one-to-one,而是仍使用many-to-one,示例以下:
<many-to-one name=「parent」 class=「cn.javass.h3.parentchild.Parent」 column=「tbl_parent_fk」/>
3:測試程序裏面,原來調用集合的地方,變成調用一個Child對象,其餘就差很少了,能夠測試看看。
Hibernate4的過濾器
Hibernate3 新增了對某個類或者集合使用預先定義的過濾器條件(filter criteria)的功能。過濾器條件至關於定義一個 很是相似於類和各類集合上的「where」屬性的約束子句,
可是過濾器條件能夠帶參數,應用程序能夠在運行時決
定是否啓用給定的過濾器,以及使用什麼樣的參數值。過濾器的用法很像數據庫視圖,只不過是在應用程序中肯定使用什麼樣的參數的。
定義過濾器
要使用過濾器,首先要在相應的映射節點中定義。而定義一個過濾器,要用到位於 <hibernatemapping/>節點以內的 <filter-def/> 節點:
示例以下:
java代碼:
<filter-def name="myFilter">
<filter-param name="myFilterParam" type="string"/>
</filter-def>
使用過濾器之配置
定義好以後,就能夠在某個類中使用這個過濾器:
java代碼:
<class name="myClass" ...>
...
<filter name="myFilter" condition=":myFilterParam=FILTERED_COLUMN"/>
</class>
或者也能夠在某個集合使用它:
java代碼:
<set ...>
<filter name="myFilter" condition=":myFilterParam=FILTERED_COLUMN"/>
</set>
在同時可使用多個過濾器。
使用過濾器之程序
在程序中,須要使用session接口中的:enableFilter(String filterName),getEnabledFilter(String filterName),和 disableFilter(String filterName)方法。Session中默認不啓用過濾器,必須經過enabledFilter() 方法顯式的啓用。
示例代碼session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");
過濾器示例
在Parent.hbm.xml中定義有以下的過濾器:
java代碼:
<filter-def name="myFilter">
<filter-param name="myFilterParam" type="string"/>
</filter-def>
<filter-def name="myFilter2">
<filter-param name="myFilterParam" type="int"/>
<filter-param name="myFilterParam2" type="int"/>
</filter-def>
在定義Child集合中使用
java代碼:
<set name="children" inverse="true" cascade="all" fetch="select" lazy="false" batch-size="3">
<key column="tbl_parent_fk"/>
<one-to-many class="cn.javass.h3.parentchild.Child" />
<filter name="myFilter"
condition="address like :myFilterParam"></filter>
<filter name="myFilter2" condition="uuid >= :myFilterParam and uuid <= :myFilterParam2"></filter>
</set>
程序中使用示例
java代碼:
s.enableFilter("myFilter").setParameter("myFilterParam", "%1%");
s.enableFilter("myFilter2").setParameter("myFilterParam", 1)
.setParameter("myFilterParam2", 3);
Query q = s.createQuery("select p from Parent as p ");
System.out.println("p==="+p.getChildren());