Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полиморфизм в hibernate не могу настроить, hibernate генерит неправильные запросы 
:(
    Опции темы
strangerv
Дата 10.8.2010, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 17.6.2008

Репутация: нет
Всего: нет



Всем привет!

Есть в моем классе коллекция дочерних объектов, которые являются наследниками от некоторого базового класса. Так вот, при попытке сохранить эту коллекцию в базе hibernate неправильно генерит запрос на апдейт (пытается проапдейтить абстрактный базовый класс, а не конкретного наследника).

Вот код:
Код

public class Device {
  
  public String id;

  public List<BaseEntry> list_ = new ArrayList<BaseEntry>();
}

public abstract class BaseEntry implements Serializable {

    public String id;

    public String parent;
}

public class Bay extends BaseEntry {
  public String bayType;
}

public class CrossConnection extends BaseEntry{
  public String ccType;
}




Вот маппинги:
Код

    <class name="Device" table="device" mutable="true">
        <id name="id" column="id" access="field"/>
             <list name="list_" access="field" cascade="all">
            <key column="parent_id" />
            <list-index column="id" />
            <one-to-many class="BaseEntry" />
        </list>
    </class>

и
Код

    <class name="BaseEntry" abstract="true">
        <id name="id" column="id" access="field"/>
        <union-subclass name="Bay" table="bay">
            <property name="bayType" column="baytype" access="field"/>
        </union-subclass>
        <union-subclass name="CrossConnection" table="cc">
            <property name="ccType" column="cctype" access="field"/>
        </union-subclass>
    </class>



и тестовый код для сохранения:
Код

Device device = new Device();
device.id = CURRENT_ID;
        
Bay bay = new Bay();
bay.id = "bay1";
bay.bayType = "bayType1";        
device.add(bay);
        
CrossConnection cc = new CrossConnection();
cc.id = "cc1";
cc.ccType("ccType1");
device.add(cc);

session.saveOrUpdate(device);


hibernate генерит следующий sql:
Код

Hibernate: insert into device (id) values (?)
Hibernate: insert into bay (baytype, id) values (?, ?)
Hibernate: insert into cc (cctype, id) values (?, ?)
Hibernate: update BaseEntry set parent_id=?, id=? where id=?


Естественно, база данных выдает ошибку:
Цитата

    org.postgresql.util.PSQLException: ERROR: relation "baseentry" does not exist


То-есть, hibernate пытается проапдейтить таблицу BaseEntry (которой нет, потому что класс BaseEntry — абстрактный базовый для полиформфной иерархии!!) вместо таблиц bay и cc!

Почему так? Скажите, пожалуйста, как правильно настроить сохранение полиморфной коллекции?
PM MAIL   Вверх
Zыыыыы
Дата 10.8.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 10.2.2010

Репутация: нет
Всего: нет



В Хибернейте используется неявный полиморфизм. Чтобы исправить ситуацию,  нужно прописать явно класс:
в
Код

<one-to-many class="BaseEntry" />

вместо BaseEntry написать имя класса-наследника (Bay).
При этом в коде класса Device ничего мянять не нужно.

Версия руководства старая...но зато на русском http://samsonov.bn.by/lib/hibernate/inheri...ance-strategies

Можно использовать для последней версии, но там вроде ничего нового в этой главе нет http://docs.jboss.org/hibernate/stable/cor...nheritance.html
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.