Java id为的对象不属于指定的子类
我的应用程序出现了一个奇怪的错误。Java id为的对象不属于指定的子类,java,mysql,sql,hibernate,vtiger,Java,Mysql,Sql,Hibernate,Vtiger,我的应用程序出现了一个奇怪的错误。 我试图用session.createCriteria().list()从数据库(MySQL)检索实体列表,但我得到的是org.hibernate.ErrorClassException 我查过这个错误,我知道它的意思,但我不知道如何在我的上下文中解决它 我有以下数据库结构: CREATE TABLE vtiger\u crmentity( `crmid`int(19)不为空 ) 创建表vtiger\u帐户( `accountid`int(19)不为空默认值0
我试图用
session.createCriteria().list()
从数据库(MySQL)检索实体列表,但我得到的是org.hibernate.ErrorClassException
我查过这个错误,我知道它的意思,但我不知道如何在我的上下文中解决它
我有以下数据库结构:
CREATE TABLE vtiger\u crmentity(
`crmid`int(19)不为空
)
创建表vtiger\u帐户(
`accountid`int(19)不为空默认值0
)
创建表vtiger\u accountscf(
`accountid`int(19)不为空默认值0
)
创建表vtiger\u AccountshipAds(
`accountaddressid`int(19)不为空默认值0
)
创建表vtiger\u accountbillads(
`accountaddressid`int(19)不为空默认值0
)
因此,快速解释一下,所有的表都是通过这些id列链接的,在最后一级,vtiger\u accountscf
表有1个vtiger\u accountshipads
和1个vtiger\u accountbillads
。所有表都有相同的主键。所以我把我的课做成这样(存根):
@实体
@继承(策略=InheritanceType.JOINED)
@表(name=“vtiger\u crmentity”)
公共类VTigerEntity{
@身份证
@基本(可选=假)
@列(name=“crmid”,nullable=false)
公共整数getId(){
返回此.id;
}
}
@实体
@PrimaryKeyJoinColumn(name=“accountid”)
@继承(策略=InheritanceType.JOINED)
@表(name=“vtiger\u账户”)
公共类VtigerAccount扩展了vTigerEntity{
}
@实体
@PrimaryKeyJoinColumn(name=“accountid”)
@继承(策略=继承类型。每个类的表)
@表(name=“vtiger\u accountscf”)
公共类VtigerAccountscf扩展了VtigerAccount{
}
@实体
@PrimaryKeyJoinColumn(name=“accountaddressid”)
@表(name=“vtiger\u accountbillads”)
公共类VtigerAccountbillads扩展了VtigerAccountscf{
}
@实体
@PrimaryKeyJoinColumn(name=“accountaddressid”)
@表(name=“vtiger\u accountshipads”)
公共类VtigerAccountshipads扩展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和创建会话
我的映射错误吗?你能告诉我数据库中有哪些数据记录吗
看起来不同表之间的id值相同,因此,当hibernate试图加载一个具有特定id的实体时,如果内存中已经存在另一个具有相同id的实体,则hibernate会抱怨这个问题。此外,在使用persistence.xml时@Chaitanya的答案检查中,该实体也存在映射。我遇到了相同的异常,但原因完全不同 我们有实体A、B和C。B和C扩展了A,A是抽象的,我们使用单表继承 我们还有具有相同属性的实体X、Y和Z(Y和Z扩展X,X是抽象的,我们使用单_表继承) X的字段为a,属于泛型a:
public abstract class X<T extends A> {
@ManyToOne
T field;
}
公共抽象类X{
@许多酮
T场;
}
Y和Z分别指定B和C的类型:
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorValue(value = "Y")
public abstract class Y extends X<B> {
}
继承(策略=InheritanceType.SINGLE_表)
@鉴别器值(value=“Y”)
公共抽象类Y扩展了X{
}
我们让其他类在没有指定具体类型的情况下实现X(保持附加说明:这似乎在几年内运行良好,但在架构更改后出现,其中既没有更改hibernate配置,也没有更改任何类(我们刚刚重命名了一些包)然后直到我们删除了具体的泛型类型才消失。
所有的表都是由这些id列链接的
——所以你的意思是说所有的表都有相同的id值?另外,请您澄清您所说的是什么意思。在最后一级中,vtiger_accountscf表有1个vtiger_accountshipads和1个vtiger_accountbillads。
是的,表中的id相同。我的意思是,vtiger\u帐户
与vtiger\u accountbillads
和vtiger\u accountshipads
(是给定帐户的地址)连接在一起,我不能,但是的,它们具有相同的id。如果我将它们作为单独的实体映射,而不扩展父级,我可以绕过这个问题吗,不完全是答案,但你对相同ID的洞察力让我解决了我的问题。我从继承中删除了vtiger\u accountbillads
和vtiger\u accountshipads
,并将它们设置为单个表。由于我不会直接编辑或保存它们,这解决了我的问题。谢谢。感谢Alberson的评论,我还有一个问题,当您看到此问题时,是否也尝试加载VtigerAccountshipads
?因为只有当Hibernate内存中有两个具有相同id的实体时才会出现此问题。我试图加载所有vTigeraccountshiPad
的列表。一个简单的session().createCriteria(VtigerAccountshipads.class).list()
。该问题并未消除。你刚换了模型。对于原始模型,问题仍然存在。