具有显式多态性的Hibernate表每类层次结构无法获取反射值

具有显式多态性的Hibernate表每类层次结构无法获取反射值,hibernate,polymorphism,hibernate-mapping,Hibernate,Polymorphism,Hibernate Mapping,在保存动态实体时,我遇到了IllegalArgumentException 我有两个类作为超类impl和子类mpl,它们使用每个类层次结构的表进行映射。此外,我还使用显式多态性对两个不同的表使用相同的POJO <class name="SuperclassImpl" polymorphism="explicit" table="super_class" mutable="true" discriminator-value="1000"> <id name='id' type='

在保存动态实体时,我遇到了IllegalArgumentException

我有两个类作为超类impl子类mpl,它们使用每个类层次结构的表进行映射。此外,我还使用显式多态性对两个不同的表使用相同的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>
}

}

您是否发现代码或映射有任何问题?在保存子类mplhist时,我遇到了此异常

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

非常感谢您的回答。

在代码中,您尝试使用sane id“109305L”保存这两个对象。但hibernate无法更改记录的类型。您可以尝试手动更改数据库中“数据”列的值。但我强烈建议不要这样做,在创建记录后,找到另一个不需要更改记录类型的记录。

经过半天的代码调试后,我发现这确实是我使用的hibernate版本中的一个bug,即hibernate 3.0版

问题出现在方法中的代码文件org.hibernate.tuple.entity.EntityMetamodel中

public String findEntityNameByEntityClass(Class inheritenceClass) {
    return ( String ) entityNameByInheritenceClassNameMap.get( inheritenceClass.getName() );
}
EntityNameByInheritanceClassNameMap持有类类型为的键。
对于我的问题,我没有解决当前hibernate版本的问题。

感谢您的回复!我在两次不同的运行中添加了相同的id用于测试,但现在刚刚更正为具有不同的id。您是否看到映射或代码中存在任何问题?
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);
"java.lang.IllegalArgumentException: Can not set   java.lang.Long field SubClassImpl.id to java.lang.Long"
public String findEntityNameByEntityClass(Class inheritenceClass) {
    return ( String ) entityNameByInheritenceClassNameMap.get( inheritenceClass.getName() );
}