2012-10-14 56 views
0

使用Hibernate實體。 DB中有AddressRoom實體和適當的表。
Address可以有多個Room s。
使用相關表中的FK列值更新表

兩個表都有address_IdcustomerEmailAddress
這些列FKRoom表中,以Address表引用。

數據庫中已有Address記錄。
需要添加幾個房間到this地址。

如何組織AddressRoom之間有註解Hibernate的關係,所以Room表進行相應的屬性,從地址進行更新:
address_IdcustomerEmailAddress

Java的部分看起來像:

Room room = new Room(); 
    Address addr = someService.getAddressFromSession(); 
    room.add(addr); 
    entityManager.persist(room); 
    Room room2 = new Room(); 
    room2.add(addr); 
    entityManager.persist(room2); 

DB結果(房間表)應該如下:
id || addressId || customerEmailAddress
1 || 3                           || [email protected]
2 || 3                           || [email protected]

回答

1

你還沒有提到兩個表的主鍵。假設兩個表有自己的主鍵, 我認爲你可以使用有如下組件模型AddressRoom對象之間進行標準映射:

  1. 地圖address_idcustomerEmailAddress組件。請參閱文檔以獲取組件映射 - Hibernate Component Mapping

  2. AddressOne-To-Many關係使用以上定義組件,並設置cascadeAll添加rooms

  3. addressRoom作爲Many-To-One使用上面定義的組件。

  4. Address定義一個addRoom方法如下(概念):

    public void addRoom(Room room){ 
         if(this.rooms == null){ 
          this.rooms = new ArrayList<Room>(); 
         } 
         room.setAddress(this); 
         this.rooms.add(room); 
        } 
    
  5. 現在你可以在Address水平只是工作。要保存room,添加roomaddress和保存地址。

希望這有助於!

+0

喜Yogendra,謝謝你hint.I會反饋很快它的工作原理。 – sergionni

+0

得到'... MySQLIntegrityConstraintViolationException:重複條目...',而堅持'地址',儘可能在數據庫中存在。也許,我應該使用其他'CascadeType'? – sergionni

+0

你的房間桌子上還有其他限制嗎?另外請確保,除了新的房間對象外,所有的房間對象都填充了「Id」(主鍵)。所有舊房間對象應該只是原來加載的對象。 Hibernate使用主鍵來確定,無論是插入還是更新。另外**使用'merge'代替'persist' **來避免重複的約束異常。 –