gpt4 book ai didi

java - 带有 id 的对象不属于指定的子类

转载 作者:可可西里 更新时间:2023-11-01 07:05:15 27 4
gpt4 key购买 nike

我的应用程序出现了一个奇怪的错误。
我正在尝试使用 session.createCriteria().list() 从数据库 (MySQL) 中检索实体列表,但我得到了这个 org.hibernate.WrongClassException .

我查过这个错误,我知道它是什么意思,但我不知道如何根据我的上下文解决它。

我有以下数据库结构:

CREATE TABLE vtiger_crmentity (
`crmid` int(19) NOT NULL
)

CREATE TABLE vtiger_account (
`accountid` int(19) NOT NULL DEFAULT 0
)

CREATE TABLE vtiger_accountscf (
`accountid` int(19) NOT NULL DEFAULT 0
)

CREATE TABLE vtiger_accoutshipads (
`accountaddressid` int(19) NOT NULL DEFAULT 0
)

CREATE TABLE vtiger_accountbillads (
`accountaddressid` int(19) NOT NULL DEFAULT 0
)

所以,快速解释一下,所有表都由这些 id 列链接,在最后一层,vtiger_accountscf 表有 1 个 vtiger_accountshipads 和 1 个 vtiger_accountbillads。所有的表都有相同的PK。
所以我做了这样的类(class)( stub ):

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "vtiger_crmentity")
public class VtigerCrmentity {
@Id
@Basic(optional = false)
@Column(name = "crmid", nullable = false)
public Integer getId() {
return this.id;

}
}


@Entity
@PrimaryKeyJoinColumn(name = "accountid")
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "vtiger_account")
public class VtigerAccount extends VtigerCrmentity {

}

@Entity
@PrimaryKeyJoinColumn(name = "accountid")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "vtiger_accountscf")
public class VtigerAccountscf extends VtigerAccount {
}

@Entity
@PrimaryKeyJoinColumn(name = "accountaddressid")
@Table(name = "vtiger_accountbillads")
public class VtigerAccountbillads extends VtigerAccountscf {
}

@Entity
@PrimaryKeyJoinColumn(name = "accountaddressid")
@Table(name = "vtiger_accountshipads")
public class VtigerAccountshipads extends VtigerAccountscf {
}

这是我的问题。当我这样做时:

getSession().createCriteria(VtigerAccountbillads.class).list();

我遇到了异常:

org.hibernate.WrongClassException: Object with id: 11952 was not of the specified subclass: VtigerAccountbillads (loaded object was of wrong class class VtigerAccountshipads)
at org.hibernate.loader.Loader.instanceAlreadyLoaded(Loader.java:1391)
at org.hibernate.loader.Loader.getRow(Loader.java:1344)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:611)
at org.hibernate.loader.Loader.doQuery(Loader.java:829)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2533)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)

由于项目限制,我没有使用 spring 或类似的东西来配置 Hibernate 和创建 session 。

我的映射有误吗?

最佳答案

你能说说你在DB中有哪些数据记录吗?

似乎不同表之间的 id 具有相同的值,因此当 hibernate 尝试加载具有特定 id 的实体时,如果另一个具有相同 id 的实体已经存在于内存中,则 hibernate 会提示这个问题。

关于java - 带有 id 的对象不属于指定的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25533449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com