【问题标题】:Hibernate table per class hierarchy with explicit polymorphism throws can not get reflection value每个具有显式多态性的类层次结构的休眠表抛出无法获得反射值
【发布时间】:2014-08-21 09:00:05
【问题描述】:

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

我有两个类,分别是 SuperClassImplSubClassImpl,它们使用每个类层次结构中的表进行映射。另外,我使用显式多态性为两个不同的表使用相同的 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"

非常感谢您的回答。

【问题讨论】:

    标签: hibernate polymorphism hibernate-mapping


    【解决方案1】:

    在您的代码中,您尝试使用健全的 id '109305L' 保存两个对象。但是休眠不能改变记录的类型。您可以尝试手动更改数据库中“数据”列的值。但我强烈建议不要遵循这种方式,并在创建后找到另一个不需要更改记录类型的方式。

    【讨论】:

    • 感谢您的回复!我在两次不同的运行中添加了相同的 id 进行测试,但现在只是更正为具有不同的 id。您是否发现映射或一般代码中有任何问题?
    【解决方案2】:

    经过半天的代码调试,发现确实是我使用的hibernate版本是hibernate 3.0版本的bug。

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

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

    entityNameByInheritenceClassNameMap 持有 Class 类型的键。 对于我的问题,我无法修复当前的休眠版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-26
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多