Таблица гибернации для каждой иерархии классов с явными бросками полиморфизма не может получить значение отражения

Я получаю IllegalArgumentException при сохранении динамического объекта,

У меня есть два класса: SuperClassImpl и SubClassImpl, которые сопоставляются с использованием таблицы для иерархии классов. Кроме того, я использовал явный полиморфизм для использования одного и того же POJO для двух разных таблиц.

<class name="SuperclassImpl" polymorphism="explicit" table="super_class" mutable="true" discriminator-value="1000">
<id name='id' type='long'>
<discriminator column="data" type="int"/>
<version name='version'/>
<property name="entry"/>
<subclass name="SupclassImpl" discriminator-value="1">
    <property name="subId" column="sub_id" type="long"/>
</subclass>

<class name="SuperclassImpl" entity-name="SuperclassImplHist"  table="super_class_hist" mutable="true" discriminator-value="1000">
<composite-id>
   <key-property name="id" type="long"/>
   <key-property name="fromDate" type="imm_timestamp"/>
</composite-id>
<discriminator column="data" type="int"/>
<property name="entry"/>
<subclass name="SupclassImpl" entity-name="SupclassImplHist" discriminator-value="1">
    <property name="subId" column="sub_id" type="long"/>
</subclass>

public class SuperClassImpl implements Serializable {
private Long id;
private int version;
private String entry;

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public String getEntry() {
    return entry;
}

public void setEntry(String entry) {
    this.entry = entry;
}

}

public class SubClassImpl extends SuperClassImpl {

private Date fromDate;
private Long subId;

public Date getFromDate() {
    return fromDate;
}

public void setFromDate(Date fromDate) {
    this.fromDate = fromDate;
}

public Long getSubId() {
    return id;
}

public void setSubId(Long subId) {
    this.subId = subId;
}

}

/*this below code works and saves the entity*/
SuperClassImpl sci = new SuperClassImpl();
pbe.setId(109305L);
pbe.setEntry("started");
pbe.setFromDate(new Date());
HibernateUtil.currentSession().save("SuperClassImplHist", sci);


/*not working and throws exception 
Caused by: java.lang.IllegalArgumentException: Can not set   java.lang.Long field      SubClassImpl.id to java.lang.Long*/
SubClassImpl sci = new SubClassImpl();
pbe.setId(109321L);
pbe.setSubId(2123L);
pbe.setEntry("started");
pbe.setFromDate(new Date());
HibernateUtil.currentSession().save("SubClassImplHist", sci);

Видите ли вы какие-либо проблемы с кодом или отображением? При сохранении SubClassImplHist я получаю это исключение

"java.lang.IllegalArgumentException: Can not set   java.lang.Long field SubClassImpl.id to java.lang.Long"

Большое спасибо за ваши ответы.


person user3028989    schedule 21.08.2014    source источник


Ответы (2)


В своем коде вы пытаетесь сохранить оба объекта с нормальным идентификатором «109305L». Но спящий режим не может изменить тип записи. Вы можете попробовать вручную изменить значение столбца «данные» в своей БД. Но я настоятельно рекомендую не идти по этому пути и найти другой, который не требует изменения типа записи после создания.

person talex    schedule 21.08.2014
comment
Спасибо за ответ! Я добавил один и тот же идентификатор для тестирования в двух разных прогонах, но теперь просто исправил, чтобы иметь другой идентификатор. Видите ли вы какие-либо проблемы с отображением или в коде в целом? - person user3028989; 21.08.2014

После полдня отладки кода я обнаружил, что это действительно ошибка в версии гибернации, которую я использую, которая находится в версии гибернации 3.0.

Проблема была в файле кода org.hibernate.tuple.entity.EntityMetamodel в методе

public String findEntityNameByEntityClass(Class inheritenceClass) {
    return ( String ) entityNameByInheritenceClassNameMap.get( inheritenceClass.getName() );
}

EntityNameByInheritenceClassNameMap содержит ключ с типом класса. Для моей проблемы у меня нет исправления с текущей версией спящего режима.

person user3028989    schedule 23.08.2014