当前位置: 首页 > 知识库问答 >
问题:

从hibernate 4升级到5.2.17时,单表继承中的异常

暨曾笑
2023-03-14

我有以下课程:

@Entity
@Table(name = "TranzitOfficeLayer")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, include = "all")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorOptions(force = true)
public abstract class OfficeLayer implements Serializable, ir.customs.saloon.OfficeLayer, Cloneable {
...
}
@Entity
@Table(name = "EstelamAzDarbKhorujLayer")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, include = "all")
@DiscriminatorValue("EstelamAzDarbKhorujLayer")
public class EstelamAzDarbKhorujLayer extends OfficeLayer implements Serializable {

    @Basic(optional = true)
    @Cache(include = "all", usage = CacheConcurrencyStrategy.READ_WRITE)
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @Fetch(FetchMode.SUBSELECT)
    @JoinTable(name = "TranzitOfficeLayer_DarbeKhorujOfficeLayers",
            joinColumns = @JoinColumn(name = "TranzitOfficeLayer_dbId", referencedColumnName = "dbId"),
            inverseJoinColumns = @JoinColumn(name = "darbeKhorujOfficeLayerses_serialNum", referencedColumnName = "serialNum"))
    private Collection<DarbeKhorujOfficeLayers> darbeKhorujOfficeLayerses;

    public Collection<DarbeKhorujOfficeLayers> getDarbeKhorujOfficeLayerses() {
        if (darbeKhorujOfficeLayerses == null) {
            return new LinkedList<>();
        }
        return darbeKhorujOfficeLayerses;
    }
}
@Entity
@Table(name = "EstelamAzDarbKhorujVaredat")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, include = "all")
@DiscriminatorValue("EstelamAzDarbKhorujVaredat")
public class EstelamAzDarbKhorujVaredat extends EstelamAzDarbKhorujLayer {
}
@Entity
@Table(name = "EstelamAzDarbkhorujSaderat")
@DiscriminatorValue(value = "EstelamAzDarbKhorujSaderat")
public class EstelamAzDarbKhorujSaderat extends EstelamAzDarbKhorujVaredat {
}

当我在开放会话中从EstelamAzDarbKhorujLayer类调用getDarbeKhorujOfficeLayerses()方法时,会抛出异常:

Caused by: org.hibernate.WrongClassException: Object [id=194759] was not of the specified subclass [EstelamAzDarbKhorujSaderat] : loaded object was of wrong class class EstelamAzDarbKhorujVaredat
    at org.hibernate.loader.plan.exec.process.internal.EntityReferenceInitializerImpl.hydrateEntityState(EntityReferenceInitializerImpl.java:190)
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.readRow(AbstractRowReader.java:103)
    at org.hibernate.loader.plan.exec.internal.EntityLoadQueryDetails$EntityLoaderRowReader.readRow(EntityLoadQueryDetails.java:241)
    at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:122)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86)
    at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:167)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4121)
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:508)
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:478)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:219)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:278)
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1240)
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1123)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:682)
    at org.hibernate.type.EntityType.resolve(EntityType.java:464)
    at org.hibernate.type.ManyToOneType.resolve(ManyToOneType.java:239)
    at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:171)
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:128)
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.performTwoPhaseLoad(AbstractRowReader.java:238)
    at org.hibernate.loader.plan.exec.process.internal.AbstractRowReader.finishUp(AbstractRowReader.java:209)
    at org.hibernate.loader.plan.exec.process.internal.ResultSetProcessorImpl.extractResults(ResultSetProcessorImpl.java:133)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:122)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:86)
    at org.hibernate.loader.collection.plan.AbstractLoadPlanBasedCollectionInitializer.initialize(AbstractLoadPlanBasedCollectionInitializer.java:87)
    at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(AbstractCollectionPersister.java:688)
    at org.hibernate.event.internal.DefaultInitializeCollectionEventListener.onInitializeCollection(DefaultInitializeCollectionEventListener.java:75)
    at org.hibernate.internal.SessionImpl.initializeCollection(SessionImpl.java:2223)
    at org.hibernate.collection.internal.AbstractPersistentCollection$4.doWork(AbstractPersistentCollection.java:565)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:247)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:561)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:132)
    at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:277)

数据库中DTYPE列的值是EstelamAzDarbKhorujVaredat,但似乎hibernate试图将此对象标识为EstelamAzDarbKhorujSaderat

此外,当我处于调试模式并且我在断点上计算darbeKhorujOfficeLayerses字段的实时值时,该异常不会引发。

代码在hibernate 4中运行良好,但当我升级到hibernate 5.2.17时发生了这种情况。我已经搜索了很多天来寻找解决方案,但都没有成功。提前谢谢你!

共有1个答案

张森
2023-03-14

该问题是由HHH-4742引起的。只需确保您不会通过基类加载实体,然后通过其子类重新加载实体即可。

< code>@DiscriminatorValue在映射中是多余的,因为它与类名匹配。尝试移除它。

此外,在以下情况下需要使用@DiscriminatorOptions#force

该表包含具有未映射到持久类的额外鉴别器值的行

 类似资料:
  • 问题内容: Django中对单表继承有显式支持吗?最后我听说,该功能仍在开发和辩论中。 在此期间是否可以使用库/黑客来捕获基本行为?我有一个混合了不同对象的层次结构。具有Employee类,雇员类型的子类和manager_id(parent_id)的公司结构的规范示例将很好地逼近我正在解决的问题。 就我而言,我想代表一个想法,即一个员工可以在由另一个员工管理的同时管理其他员工。没有用于Manage

  • 问题内容: 我该如何继承其父代的样式和javascript。 我努力了 但是,它会删除标签。此外,我看不到影响iframe的样式。 我是否有更好/其他的方法来解决这个问题?谢谢。 问题答案: 您可以通过在iframe中使用以下代码来“继承”父级的CSS: 在IE,Chrome和Firefox中对我来说效果很好。 关于JavaScript,我找不到直接将父JavaScript添加到iframe中的方

  • 我有两个实体BillingAddress和ShippingAddress映射到具有鉴别器类型列的表地址。 我能够使用不同的类型值在DB中成功保存/更新两个地址类型。 我面临的问题是当我查询地址表时,如下所示: 这工作正常,但查询ShippingAddress会引发非均匀查询结果异常,即结果中同时包含ShippingAddress和Billingaddress。请让我知道,我应该怎么做。

  • 从标准 JPA (EclipseLink) 迁移到Hibernate时,由于子记录数量不正确和/或子对象的类型无效,测试失败。我认为问题是Hibernate生成的 SQL 没有在InheritanceType.SINGLE_TABLE关系的 where 子句中使用鉴别器列。 关于在映射中更改什么的任何建议? 提前感谢, 蒂莫西 环境 < li>postgres 9.6.17 < li >Sprin

  • 问题内容: 假设我们有这个问题 扩展和覆盖,但鉴于实现现在会引发异常。由于覆盖方法不能引发新的异常,因此不会编译。 最好的解决方案是什么? 将所需的异常传播到。对我来说,这是反对封装,继承和一般OOP的(可能会引发永远不会发生的异常)。 使用呢?此解决方案不会将传播到,但是Oracle文档和其他来源指出,当“客户端代码无法执行任何操作”时,应使用异常类。并非这种情况,此异常将对恢复blablabl

  • 主要内容:单表策略示例单表策略是定义继承实现的最简单有效的方法之一。 在这种方法中,多个实体类的实例仅作为属性存储在单个表中。 以下语法表示单个表策略 - 单表策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(它是