我有一个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映射吗?
答案 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);
}