2017-02-22 20 views
0

У меня есть иерархия хранения EMF: Дом содержит список Комната s, представленный с использованием файла ecore.Econtainer null при загрузке содержимого EMF из базы данных с использованием Hibernate

Перед сохраняющиеся, когда я сначала создать свой дом и заселить его номер, в значение eContainer для номера объекта правильно показать, содержащий дом. Затем я использую Hibernate (не задействованный Teneo), чтобы сохранить дом (который каскад - сохраняет комнаты).

Когда я перезагружаю объект Дома, я получаю ссылки на все Комнаты. Тем не менее, eContainer значение для комнаты в настоящее время null. Это актуально, потому что я использую EcoreUtil.delete (ванная), чтобы удалить комнату из ее содержащего дома, и которая использует EObject.eContainer().

Соответствующие Hibernate Mapping:

<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 при загрузке? Должен ли я изменить отображение спящего режима?

+0

В чем причина не использования Teneo? Это мост между EMF и Hibernate ... –

+0

Основная причина (возможно, не очень хорошая) заключается в том, что мы использовали Hibernate с самого начала и не знаем, как трудно было бы перейти на Teneo. – joe

ответ

0

Hibernate требует, чтобы каждое имущество имело геттер и сеттер. В EMF (по крайней мере, не используя Teneo) есть геттер для Номера, но нет сеттера.

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 не получал множество. Я перешел к следующему: в базовом варианте реализации используется EObjectContainmentList, и пока это работает.

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

Я бы порекомендовал спросить на форуме Teneo (EMF Technology) стратегию миграции, прежде чем пытаться построить собственный мост. Автор довольно отзывчив. Я уверен, что это не единственная ловушка, в которую ты попал ... –

Смежные вопросы