【问题标题】:Update table with FK column values from related table使用相关表中的 FK 列值更新表
【发布时间】:2013-11-30 08:55:30
【问题描述】:

使用休眠实体。 DB中有AddressRoom实体和相应的表。
Address可以有多个Rooms。

两个表都有address_IdcustomerEmailAddress
这些列是Room 表中的FK,引用Address 表。

DB 中已有 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);

数据库结果(房间表)应该如下:
id||addressId|| 客户电子邮件地址
1 || 3               || mail3@a.com
2 || 3               || mail3@a.com

【问题讨论】:

    标签: java hibernate sql-update database-relations


    【解决方案1】:

    您还没有提到这两个表的主键。假设两个表都有自己的主键, 我认为您可以使用组件模型在AddressRoom 对象之间完成标准映射,如下所示:

    1. address_idcustomerEmailAddress 映射为组件。请参阅此处的组件映射文档--Hibernate Component Mapping

    2. 使用上面定义的组件在AddressOne-To-Many 关系中添加rooms,并将cascade 设置为All

    3. 使用上面定义的组件将address 添加到Room 中作为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,请将room 添加到address 并保存地址。

    希望这会有所帮助!

    【讨论】:

    • 嗨 Yogendra,谢谢你的提示。我会尽快反馈它是如何工作的。
    • 得到了...MySQLIntegrityConstraintViolationException: Duplicate entry...,同时坚持Address,到目前为止它已经存在于数据库中。也许,我应该使用其他CascadeType
    • 你的房间桌子有其他限制吗?另外请确保所有房间对象都填充有Id(主键),新房间对象除外。所有旧房间对象应该只是最初加载的对象。 Hibernate 使用主键来确定是插入还是更新。另外使用merge 代替persist 以避免重复约束异常。
    • 看来问题在于customerEmailAddressaddressId 在mysql 创建脚本上被定义为unique key。这意味着它们应该是唯一的,因为它们代表tuple
    • 很高兴知道您的问题已解决。如果您认为答案有帮助,请不要忘记接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多