2012-10-14 51 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' **来避免重复的约束异常。 –