JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Object Relational Mapping » Hibernate  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
作者 一對一外鍵關聯, 新增資料,hibernet竟允許多對1的資料寫入表格
jenuls





發文: 49
積分: 0
於 2016-10-07 01:39 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Dear 大大:
想請問一個關於 1對1映射(外鍵關聯) 的問題。我主要是參考 良葛格的文章,如下

一對一(唯一外鍵關聯)
http://openhome.cc/Gossip/HibernateGossip/OneToOneUniqueFK.html

文中提到
用外鍵來完成一對一,其實就是限制多對一關係中,「多」的一方只能有一個參考至「一」的一方,也就是多對一關係的一個特例,這可以在映射文件中使用 <many-to-one>標籤時,加上"unique"屬性來設定
1
2
3
4
5
6
     <many-to-one name="room" 
                     column="room_id" 
                     class="onlyfun.caterpillar.Room"
                     cascade="all"
                     outer-join="true"
                     unique="true"/> 

我實作程式,作雙向1對1映射(外鍵關聯),程式碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
session = HibernateUtil.getSessionFactory().openSession();
Room room1 = new Room();
room1.setId("1");
room1.setFloor("3F");
 
Room room2 = new Room();
room2.setId("2");
room2.setFloor("5F");
 
User1 userA = new User1();
userA.setName("david");
User1 userB = new User1();
userB.setName("jack");
 
//故意將userA及 userB 設定同一個房間room1. 看看hibernate 會不會發生錯誤。
userA.setRoom(room1);
userB.setRoom(room1);   
 
tx = session.beginTransaction();
session.save(userA);
session.save(userB);
tx.commit();

我故意將userA及 userB 設定同一個房間room1. 看看hibernate 會不會產生exception。因為我認為既然加上了unique="true", hibernate應該只允許 1個user對應1個room.
如果我將userA及 userB 設定同一個房間room1, 那邊hibernate應該要產生 exception,不允許多對1的資料寫入表格。測試結果竟順利寫入表格。 room1 被寫入ROOM表格,
userA 與 userB也寫入USER表格。其ROOM_ID 欄位 對應到 room1 的 id,形成多對1的資料。
這種情形我覺得不合理,我認為hibernate應該會檢查,因為hbm.xml已設定1對1 。不曉得各位前輩可否為我解惑,感謝。我使用的是 Hibernate5.01的版本
User1.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<hibernate-mapping>
 <class name="table.User1" table="USER1">
    <id name="id" type="string">
       <column length="100" name="ID"/>
       <generator class="uuid.hex"/>
    </id>
    <property generated="never" lazy="false" name="name" type="string">
           <column length="30" name="NAME"/>
    </property>
    
    <many-to-one cascade="all" class="table.Room" fetch="select"    name="room" unique="true">
       <column length="100" name="ROOM_ID"/>
    </many-to-one>
    
 </class>
</hibernate-mapping>


Room.hbm.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
<hibernate-mapping>
 <class name="table.Room" table="ROOM">
   <id name="id" type="string">
      <column length="100" name="ID"/>
      <generator class="assigned"/>
   </id>
   <property generated="never" lazy="false" name="floor" type="string">
       <column length="10" name="FLOOR"/>
   </property>
   <one-to-one cascade="all" class="table.User1" name="user" property-ref="room"/>
 
 </class>
</hibernate-mapping>


jenuls edited on 2016-10-07 01:41
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
1158 一對一外鍵關聯, 新增資料,hibernet竟允許多對1的資料寫入表格 jenuls 2462 2016-10-07 01:39
951 Re:一對一外鍵關聯, 新增資料,hibernet竟允許多對1的資料寫入表格 jenuls 520 2016-10-11 07:36
1037 Re:一對一外鍵關聯, 新增資料,hibernet竟允許多對1的資料寫入表格 jenuls 124 2016-10-11 07:41
» JWorld@TW »  Object Relational Mapping » Hibernate

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8