Hibernate JPA错误类异常-继承

Hibernate JPA错误类异常-继承,hibernate,jpa,Hibernate,Jpa,我有一个Account抽象类,由另外两个类继承: DoctorAccount,NurseAccount(为了保持文章简短,我省略了getter和setter)。执行方法checkiLoginandPasswordiscorrect后,我得到一个错误: 原因:org.hibernate.ErrorClassException:对象[id=1]不属于指定的子类[Model.Account]:鉴别器:1。我发现query.getSingleResult()对此负责,但我不知道它为什么会抛出这样的错误。

我有一个
Account
抽象类,由另外两个类继承:
DoctorAccount
NurseAccount
(为了保持文章简短,我省略了getter和setter)。执行方法
checkiLoginandPasswordiscorrect
后,我得到一个错误:

原因:org.hibernate.ErrorClassException:对象[id=1]不属于指定的子类[Model.Account]:鉴别器:1
。我发现
query.getSingleResult()
对此负责,但我不知道它为什么会抛出这样的错误。使用多态性,我可以将帐户分配给医生/护士。你知道我做错了什么吗

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@Entity
@DiscriminatorColumn(name = "Type_of_account", discriminatorType = 
DiscriminatorType.STRING)
public abstract class Account {
     @Id
     @GeneratedValue(strategy=GenerationType.AUTO)
     @Column(name="Id")
     private int id;
     @Column(name="Login")
     private String login;
     @Column(name="Password")
     private String password;
}

@Entity
public class NurseAccount extends Account{
}

@Entity
public class DoctorAccount extends Account{
}
在logInDAO类中:

@Override
public boolean checkIfLoginAndPasswordIsCorrect(String login, String password) {
    Account account = null;
    EntityManagerFactory managerFacotry = Persistence.createEntityManagerFactory("manager");
    EntityManager manager = managerFacotry.createEntityManager();
    manager.getTransaction().begin();
    Query query =  manager.createQuery("SELECT a from Account a WHERE a.login = :login AND a.password = :password")
            .setParameter("login", login).setParameter("password", password);
    manager.getTransaction().commit();
    try {
         account = (Account) query.getSingleResult(); // HERE Occures error
    }
    catch(NoResultException lackOfResult){  
        return false;
    }
    if(account != null)
    {
        return true;
    }
    return false;
}

}
您需要添加
@org.hibernate.annotations.DiscriminatorOptions(force=true)
在您的帐户类上

是否确定没有返回多个结果是的,在数据库中我只有一条记录想知道调用了什么SQL。可能是在日志中发现的,使用不同的JPA提供程序,这将生成以下形式的SQL
从帐户a中选择a.ID、a.LOGIN、a.PASSWORD、a.TYPE\u of_帐户((a.TYPE\u of_帐户='DoctorAccount'或a.TYPE\u of_帐户='NurseAccount'))和a.LOGIN=和a.PASSWORD=
。这将返回一个
DoctorAccount
对象。因此,您可以得出结论,这是您的JPA提供商的一个缺点。报告一个bug为什么有人在使用JPAAPI时需要使用特定于Hibernate的东西?他们不应该。曾经。我同意,但考虑到当时的情况,我只是建议了一种方法,如果没有达到理想的解决方案,那么JPA规范是否有解决方案?@Michael213要查看JPA“解决方案”,您需要定义精确的问题,因为您没有给出JPA提供商出错的原因的信息;也许,只是也许,其他JPA提供商在这个输入上做得对吗?aka您的提供商中的bug,该提供商特定的属性“修复”到今天为止我还不知道,但我记得从过去的经验来看,这也对我起到了作用。但有一点是,有时鉴别器列的大小与插入的数据不匹配。如果是这种情况,则会添加空格,但不确定这种情况是否适用。