Posted on 2008-08-26 04:10
H2O 閱讀(646)
評(píng)論(0) 編輯 收藏 所屬分類:
hibernate
Hibernate一對(duì)一關(guān)系操作對(duì)象
總的來說有四種方式,我將意義的在本片文章中介紹
一:以主鍵關(guān)聯(lián)
概念:關(guān)聯(lián)的兩個(gè)實(shí)體共享一個(gè)主鍵
例如我們建立兩個(gè)表,分別為user id pk,name,password
userinfor id pk,email,age,address
user和userinfor共享一個(gè)主鍵id,并且兩個(gè)表是一對(duì)一關(guān)系,那么如何讓一個(gè)表引用另一個(gè)表生成的主鍵那?我們可以用hibernate的主鍵foreign機(jī)制生成。
我們先看看user.hbm.xml文件
.......
<hibernate-mapping>
<class name="model.User" lazy="true">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="name" type="string"/>
<property name="password" type="string"/>
<one-to-one name="userinfor"
class="model.Userinfor"
fetch="join"
cascade="all"
/>
</class>
<hibernate-mapping>
.......
one-to-one的屬性cascade=all表示user的增刪改操作也會(huì)反映在userinfor對(duì)象當(dāng)中。我們?cè)倏纯磚serinfor.hbm.xml文件.
<hibernate-mapping>
<id name="id">
<generator name="foreign">
<param name="property">user</param>
</generator>
</id>
<property name="email" column="email" type="string"/>
<property name="age" column="age" type="int"/>
<property name="address" column="address" type="string"/>
<one-to-one name="user"
class="model.User"
constrained="true"<!-引用user的主鍵id為外鍵-->
/>
</hibernate-mapping>
讓我們看看java的代碼片段
.....
User user=new User();
user.setName("name");
user.setPassword("pass");
Userinfor u=new Userinfor();
u.setEmail("email");
u.setAge(11);
u.setAddress("address");
user.setUserinfor(u);
u.setUser(user);
DAO.saveObj(user);
最后打開你的數(shù)據(jù)庫舊可以看到結(jié)果了。
二,一對(duì)一以外鍵關(guān)聯(lián)
以外鍵關(guān)聯(lián)的概念:兩個(gè)實(shí)體各自有不同的主鍵,但是一個(gè)實(shí)體有一個(gè)外鍵引用另一個(gè)實(shí)體的主鍵。例如:
表 user id pk,name,passeword
userinfor id pk,uid fk,infor
先看user.hbm.xml
......
<hibernate-mapping>
<class name="user" table="user" lazy="true">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="name" type="string"/>
<property name="password" type="string"/>
<one-to-one name="userinfor"
class="model.Userinfor"
fetch="join"
cascade="all"
/>
</class>
</hibernate-mapping>
可以看到這個(gè)同我們第一次用到的一樣啊
然后我們看看userinfor.hbm.xml的結(jié)構(gòu)
.....
<hibernate-mapping>
<class name="userinfor" table="userinfor" lazy="true">
<id name="id">
<generator class="uuid.hex"/>
</id>
<property name="infor" column="infor" type="string"/>
<many-to-one name="user"
class="model.User"
unique="true"
<!-唯一的多對(duì)一,其實(shí)就便成了一對(duì)一了-->
columnn="uid"
/>
</class>
</hibernate-mapping>
以外鍵關(guān)聯(lián)的一對(duì)一,其實(shí)就變成了一對(duì)多的雙向關(guān)聯(lián),編寫時(shí)直接按照一對(duì)多和多對(duì)一的要求編寫,最后在many-to-one加上unique='true'即可說明他只不過是一對(duì)多關(guān)系的一個(gè)特例。編寫java代碼:
.......
User u=new User();
u.setName("name");
u.setPassword("password");
Userinfor ui=new Userinfor();
ui.setInfor("infor");
u.setUserinfor(ui);
ui.setUser(u);
DAO.saveObj(u);
......
三:默認(rèn)的級(jí)連關(guān)系
一對(duì)多默認(rèn)級(jí)連關(guān)系為預(yù)先抓取,而一對(duì)多,多對(duì)多都是立即加載
看看user.hbm.xml
<one-to-one name="userinfor"
class="model.Userinfor"
cascade="all"/>
以上我們并沒有顯示的設(shè)置級(jí)連關(guān)系。這樣在取的userinfor時(shí)將用默認(rèn)的級(jí)連關(guān)系。
.....
User u=(User)DAO.getByid(User.class,"字符穿,相當(dāng)于where id='此值'");
四:延遲加載
一對(duì)一關(guān)系進(jìn)行延遲加載時(shí)與其他關(guān)系不同,多對(duì)一是在class標(biāo)簽中設(shè)置lazy='true',一對(duì)多和多對(duì)多是在set標(biāo)簽中設(shè)置lazy=”true“,而一對(duì)一則在class標(biāo)簽當(dāng)中設(shè)置lazy='true'并且在one-to-one標(biāo)簽當(dāng)中設(shè)置constrained='true'。
.....
<hibernate-mapping>
<class name="model.User" table="user">
<one-to-one name="userinfor"
class="model.Userinfor"
contrained="true"
cascade="all"
/>
</class>
</hibernate-mapping>
java代碼
...
User u=(User)DAO.getByid(User.class,"id");
.....
次代碼只是加載了user對(duì)象,而沒有加載userinfor對(duì)象,而且忽略了默認(rèn)的預(yù)先抓取,(這是默認(rèn)的,只有顯示的指定fatch='true'時(shí)才采用預(yù)先抓取的)
完