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

时间:2014-08-21 09:00:05

标签: hibernate polymorphism hibernate-mapping

我在保存动态实体时遇到 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"

非常感谢你的回答。

2 个答案:

答案 0 :(得分:0)

在您的代码中,您尝试使用合理的ID&#39; 109305L&#39;保存这两个对象。但是hibernate无法改变记录的类型。您可以尝试手动更改数据&#39;数据库中的列。但我强烈建议不要按照这种方式找到另一个不需要在创建后更改记录类型的记录。

答案 1 :(得分:0)

经过半天的代码调试,发现它确实是我使用hibernate 3.0版本的hibernate版本中的一个错误。

问题出在方法

中的代码文件org.hibernate.tuple.entity.EntityMetamodel中
public String findEntityNameByEntityClass(Class inheritenceClass) {
    return ( String ) entityNameByInheritenceClassNameMap.get( inheritenceClass.getName() );
}

entityNameByInheritenceClassNameMap持有Class类型的键。 对于我的问题,我没有修复当前的hibernate版本。