使用Hibernate

时间:2017-02-22 18:02:41

标签: java hibernate emf

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

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

当我重新加载House对象时,我会获得所有房间的引用。但是,Room的 eContainer 值现在为 null 。这是相关的,因为我使用 EcoreUtil.delete(浴室)从其包含的房子中删除一个房间,并使用 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引用吗?我应该更改我的hibernate映射吗?

1 个答案:

答案 0 :(得分:0)

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);
}