【问题标题】:Econtainer null when loading EMF containment from Database using Hibernate使用 Hibernate 从数据库加载 EMF 容器时,Econtainer null
【发布时间】:2017-02-22 18:02:40
【问题描述】:

我有一个 EMF 包含层次结构:一个 House 包含一个 Room 列表,使用 ecore 文件表示。

在坚持之前,当我最初创建我的房子并用房间填充它时,Room 对象的 eContainer 值正确显示包含房子。然后我使用 Hibernate(不涉及 Teneo)来保存房子(级联保存房间)。

当我重新加载 House 对象时,我得到了对所有房间的引用。但是,Room 的 eContainer 值现在为 null。这是相关的,因为我使用 EcoreUtil.delete(bathroom) 从其包含的房屋中删除房间,并且使用 EObject.eContainer()

相关的Hibernate映射:

 <class name="House" table="house" lazy="false">
 <bag name="rooms" lazy="true" cascade="save-update, delete">
        <key update="true">
            <column name="house_id" unique="false"/>
        </key>
        <one-to-many class="Room"/>
 </bag>
 </class>
 <class name="Room" table="room" lazy="false">
 </class>

我应该怎么做才能删除 EMF 对象?我应该调用 EcoreUtil.delete(obj) 以外的东西吗?我应该在加载时手动添加 eContainer 引用吗?我应该更改我的休眠映射吗?

【问题讨论】:

  • 不使用Teneo的原因是什么?它是 EMF 和 Hibernate 之间的桥梁……
  • 主要原因(也许不是一个好的原因)是我们从一开始就使用 Hibernate,不知道迁移到 Teneo 会有多难。

标签: java hibernate emf


【解决方案1】:

Hibernate 要求每个属性都有一个 getter 和 setter。在 EMF 中(至少不使用 Teneo),Rooms 有一个 getter,但没有 setter。

public EList<Room> getRooms() {
    if (rooms == null) {
        rooms = new EObjectContainmentEList<Room>(Room.class, this, housePackage.HOUSE__ROOM);
    }
    return rooms;
}

我在下面提供了我自己的二传手。

public void setRooms(List<Room> roomList) {
    this.rooms = new BasicEList<>();
    this.rooms.addAll(roomList);
}

这是不正确的,因为 BasicEList 不提供任何 EMF 通知,因此 eContainer 没有设置。我更改为以下内容,它在底层实现中使用 EObjectContainmentEList 并且到目前为止它似乎工作。

public void setRooms(List<Room> roomList) {
    ECollections.setEList(getRooms(), roomList);
}

【讨论】:

  • 我建议在尝试构建自己的桥梁之前,在 Teneo(EMF 技术)论坛上询问迁移策略。作者反应挺快的。我相信这不是你陷入的唯一陷阱......
猜你喜欢
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2014-12-06
  • 2012-06-07
  • 2018-06-30
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
相关资源
最近更新 更多