Hibernate-IllegalArgumentException发生在调用类的getter [英] Hibernate - IllegalArgumentException occurred calling getter of a class

查看:63
本文介绍了Hibernate-IllegalArgumentException发生在调用类的getter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我似乎正在收到此错误,并且不知道为什么要收到此错误.我什至不明白为什么Hibernate需要User类的getter方法,因为无论如何它都不应该直接对该类执行任何操作...

I seem to be getting this error and have no idea why I'm getting this error. I don't even understand why Hibernate needs that getter for the User class because it's not supposed to be doing any actions with that class directly anyway...

2012-12-30 09:38:56,713 [main]错误org.hibernate.property.BasicPropertyAccessor $ BasicGetter-HHH000122:类中的IllegalArgumentException:com.nortal.pirs.datamodel.User,属性的获取方法:idUser2012-12-30 09:38:56,714 [main]错误com.nortal.pirs.businesslogic.logic.VisitManagerLogic-发生IllegalArgumentException调用com.nortal.pirs.datamodel.User.idUser的getterjava.lang.IllegalArgumentException:对象不是声明类的实例

2012-12-30 09:38:56,713 [main] ERROR org.hibernate.property.BasicPropertyAccessor$BasicGetter - HHH000122: IllegalArgumentException in class: com.nortal.pirs.datamodel.User, getter method of property: idUser 2012-12-30 09:38:56,714 [main] ERROR com.nortal.pirs.businesslogic.logic.VisitManagerLogic - IllegalArgumentException occurred calling getter of com.nortal.pirs.datamodel.User.idUser java.lang.IllegalArgumentException: object is not an instance of declaring class

完整的堆栈跟踪如下:

    Hibernate: select max(idVisit) from Visit
2012-12-30 09:38:56,713 [main] ERROR org.hibernate.property.BasicPropertyAccessor$BasicGetter - HHH000122: IllegalArgumentException in class: com.nortal.pirs.datamodel.User, getter method of property: idUser
2012-12-30 09:38:56,714 [main] ERROR com.nortal.pirs.businesslogic.logic.VisitManagerLogic - IllegalArgumentException occurred calling getter of com.nortal.pirs.datamodel.User.idUser
java.lang.IllegalArgumentException: object is not an instance of declaring class
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:164)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:341)
    at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4491)
    at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4213)
    at org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:209)
    at org.hibernate.engine.internal.ForeignKeys$Nullifier.isNullifiable(ForeignKeys.java:165)
    at org.hibernate.engine.internal.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:94)
    at org.hibernate.engine.internal.ForeignKeys$Nullifier.nullifyTransientReferences(ForeignKeys.java:72)
    at org.hibernate.action.internal.AbstractEntityInsertAction.nullifyTransientReferencesIfNotAlready(AbstractEntityInsertAction.java:128)
    at org.hibernate.action.internal.AbstractEntityInsertAction.makeEntityManaged(AbstractEntityInsertAction.java:139)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:209)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:136)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:328)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:136)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:756)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:748)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:744)
    at com.nortal.pirs.persistence.dbhibernate.visits.VisitDaoHibernate.addVisit(VisitDaoHibernate.java:46)
    at com.nortal.pirs.businesslogic.logic.VisitManagerLogic.addVisit(VisitManagerLogic.java:39)
    at com.nortal.pirs.test.persistence.filldata.FillVisits.fill(FillVisits.java:31)
    at com.nortal.pirs.test.persistence.filldata.FillVisits.main(FillVisits.java:21)

尝试添加带有字段idPatient的Visit(访问)时,会发生此错误,该字段的类型为long,应该是正在为其注册访问的患者的id,所以我要获取的方法如下所示(类VisitDaoHibernate):

This error occurs when trying to add a Visit, which has a field idPatient, which is of type long and is supposed to be the id of the patient that the visit is being registered for, so the method where I'm getting this at looks like this (class VisitDaoHibernate):

@Override
    public void addVisit(Visit visit) {
        session = connection.getSession();
        session.beginTransaction();
        session.save(visit); // here it happens...
        session.getTransaction().commit();
    }

访问类:

    /**
 * @(#) Visit.java
 */

package com.nortal.pirs.datamodel;

import java.util.Date;

import com.nortal.pirs.datamodel.enumeration.VisitState;

public class Visit {
    private long idVisit;
    private long idPatient;
    private long idSpiProfessional;
    private long idProfession;
    private Date visitDate = new Date();
    private String reason = "";
    private VisitState visitState = VisitState.REGISTERED;


    /**
     * @param patient
     * @param spiProfessional
     * @param visitDate
     * @param reason
     * @param visitState
     * @param visitProfession
     */
    public Visit() {
    }   

    public Visit(Visit visit) {
        this.idPatient = visit.getIdPatient();
        this.idSpiProfessional = visit.getIdSpiProfessional();
        this.idProfession = visit.getIdProfession();
        this.visitDate = visit.getVisitDate();
        this.reason = visit.getReason();
        this.visitState = visit.getVisitState();
    }

    public long getIdVisit() {
        return idVisit;
    }

    public void setIdVisit(long idVisit) {
        this.idVisit = idVisit;
    }

    public long getIdPatient() {
        return idPatient;
    }

    public void setIdPatient(long idPatient) {
        this.idPatient = idPatient;
    }

    public long getIdSpiProfessional() {
        return idSpiProfessional;
    }

    public void setIdSpiProfessional(long idSpiProfessional) {
        this.idSpiProfessional = idSpiProfessional;
    }

    public long getIdProfession() {
        return idProfession;
    }

    public void setIdProfession(long idProfession) {
        this.idProfession = idProfession;
    }

    public Date getVisitDate() {
        return visitDate;
    }

    public void setVisitDate(Date visitDate) {
        this.visitDate = visitDate;
    }

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public VisitState getVisitState() {
        return visitState;
    }

    public void setVisitState(VisitState visitState) {
        this.visitState = visitState;
    }
}

我的用户类别:

    /**
 * @(#) User.java
 */

package com.nortal.pirs.datamodel;

import java.util.Date;

import com.nortal.pirs.datamodel.enumeration.Gender;
import com.nortal.pirs.datamodel.enumeration.UserState;

public class User {
    private long idUser;
    private String firstName = "";
    private String lastName = "";
    private String personCode = "";
    private Date birthDate = new Date();
    private Gender gender = Gender.MALE;
    private String email = "";
    private String password = "";
    private UserState userState = UserState.UNAPPROVED;

    public User(User user) {
        idUser = user.getIdUser();
        firstName = user.getFirstName();
        lastName = user.getLastName();
        personCode = user.getPersonCode();
        birthDate = user.getBirthDate();
        gender = user.getGender();
        email = user.getEmail();
        password = user.getPassword();
        userState = user.getUserState();
    }

    public User() {

    }

    public boolean sameAs(User user) {
        if (user == null) {
            return false;
        }

        if (this.getEmail().equals(user.getEmail())
                && this.getBirthDate().equals(user.getBirthDate())
                && this.getFirstName().equals(user.getFirstName())
                && this.getLastName().equals(user.getLastName())
                && this.getGender().equals(user.getGender())
                && this.getPassword().equals(user.getPassword())
                && this.getPersonCode().equals(user.getPersonCode())
                && this.getUserState().equals(user.getUserState())) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * @param firstName
     * @param lastName
     * @param personCode
     * @param birthDate
     * @param gender
     * @param email
     * @param password
     * @param userState
     */
    public User(String firstName, String lastName, String personCode,
            Date birthDate, Gender gender, String email, String password,
            UserState userState) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
        this.personCode = personCode;
        this.birthDate = birthDate;
        this.gender = gender;
        this.email = email;
        this.password = password;
        this.userState = userState;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getPersonCode() {
        return personCode;
    }

    public void setPersonCode(String personCode) {
        this.personCode = personCode;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public Gender getGender() {
        return gender;
    }

    public void setGender(Gender gender) {
        this.gender = gender;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public UserState getUserState() {
        return userState;
    }

    public void setUserState(UserState userState) {
        this.userState = userState;
    }

    public long getIdUser() {
        return idUser;
    }

    public void setIdUser(long idUser) {
        this.idUser = idUser;
    }

}

我的UserMapper xml:

My UserMapper xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.nortal.pirs.datamodel">

    <class name="User" table="User">

        <id name="idUser" type="long" column="idUser">
            <generator class="increment"/>
        </id>

        <property name="firstName" />
        <property name="lastName" />
        <property name="personCode" />
        <property name="birthDate" type="date"/>
        <property name="email" />
        <property name="password" />

       <property name="userState" column="userState" length="15">
             <type name="org.hibernate.type.EnumType">
                  <param name="enumClass">com.nortal.pirs.datamodel.enumeration.UserState</param>
                  <param name="type">12</param>
              </type>
        </property>

         <property name="gender" column="gender" length="15">
             <type name="org.hibernate.type.EnumType">
                  <param name="enumClass">com.nortal.pirs.datamodel.enumeration.Gender</param>
                  <param name="type">12</param>
              </type>
        </property>

         <joined-subclass name="Patient" table="Patient">
             <key column="idUser" />
             <property name="additionalInfo" column="additionalInfo" />
         </joined-subclass>

         <joined-subclass name="SpiProfessional" table="SpiProfessional">
                 <key column="idUser" />
         </joined-subclass>

    </class>

</hibernate-mapping>

还有我的VisitMapper xml :(这是实际上应该起作用的那个,我什至不知道为什么Hibernate完全需要用户使用吸气剂...)

And my VisitMapper xml: (this is the one, that should be in action actually, I don't even understand why Hibernate needs the getter for user at all...)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.nortal.pirs.datamodel">

    <class name="Visit"
        table="Visit">

        <id name="idVisit">
            <generator class="increment"/>
        </id>

        <property name="visitDate" type="date" />
        <property name="reason" />

       <property name="visitState" column="visitState" length="15">
             <type name="org.hibernate.type.EnumType">
                  <param name="enumClass">com.nortal.pirs.datamodel.enumeration.VisitState</param>
                  <param name="type">12</param>
              </type>
        </property>

        <many-to-one name="idPatient" not-null="false" class="com.nortal.pirs.datamodel.Patient"/>
        <many-to-one name="idSpiProfessional" not-null="false" class="com.nortal.pirs.datamodel.SpiProfessional" />
        <many-to-one name="idProfession" not-null="false" class="com.nortal.pirs.datamodel.Profession" />

我只是希望有人可以帮助我.谢谢

I just hope somebody can help me with this. Thanks

推荐答案

您要告诉Hibernate,Visit类与Patient类(以及其他两个类)具有多对一关联.它没有这种关联.如果您有这样的要求,那么Visit类将包含

You're telling Hibernate that the Visit class has a many-to-one association with the Patient class (and with two other classes). It doesn't have such an association. If you had such an assciation, the Visit class would contain

private Patient patient;

public Patient getPatient() {
    return this.patient;
}

public void setPatient(Patient patient) {
    this.patient = patient;
}

相反,您的Visit实体中包含的是患者的 ID .那不构成关联.

Instead, what you have in your Visit entity is the ID of a patient. That doesn't constitute an association.

阅读休眠文档关于关联,因为您已经错过了它们是什么,以及ORM实际允许的很多功能,即能够加载,导航和查询对象图.

Read the Hibernate documentation about associations, because you've missed what they are, and a great deal of what an ORM actually allows, which is to be able to load, navigate and query graphs of objects.

这篇关于Hibernate-IllegalArgumentException发生在调用类的getter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆