Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java id为的对象不属于指定的子类_Java_Mysql_Sql_Hibernate_Vtiger - Fatal编程技术网

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(保持)-即使数据库中没有Y或Z(这意味着Hibernate永远不必加载任何对象,实际上也不应该创建Y或Z),我们(有时)也会得到org.Hibernate.ErrorClassException。我们的解决方案是从类Y和Z中删除具体的类型B和C,并在代码中使用强制转换


附加说明:这似乎在几年内运行良好,但在架构更改后出现,其中既没有更改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()
。该问题并未消除。你刚换了模型。对于原始模型,问题仍然存在。