2012-12-30 17 views
9

我似乎得到這個錯誤,不知道爲什麼我得到這個錯誤。我甚至不明白爲什麼Hibernate需要的是getter方法的用戶類,因爲它不應該做與類的任何行動直接反正...Hibernate - 發生IllegalArgumentException調用類的獲得者

2012-12-30 09:38:56713 [主] ERROR org.hibernate.property.BasicPropertyAccessor $ BasicGetter - HHH000122:IllegalArgumentException在類中:com.nortal.pirs.datamodel.User,getter方法屬性:idUser 2012-12-30 09:38:56,714 [main] ERROR com .nortal.pirs.businesslogic.logic.VisitManagerLogic - 發生拋出:IllegalArgumentException調用com.nortal.pirs.datamodel.User.idUser java.lang.IllegalArgumentException異常的吸:對象不是聲明類的一個實例

完整的堆棧跟蹤看起來是這樣的:

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,這類型的長,應該是病人,這次訪問的ID時出現此錯誤被註冊,所以在這裏我很喜歡這個(類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:

<?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需要對於用戶的所有吸氣...)

<?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" /> 

我只希望有人能幫助我。謝謝

+0

未定義正確的映射。 –

回答

17

您告訴Hibernate Visit類與Patient類(以及其他兩個類)有多對一的關聯。它沒有這樣的聯繫。如果你有這樣的assciation,訪問類將包含

private Patient patient; 

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

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

相反,你有你的訪問的實體是一個病人的ID。這不構成一個關聯。

閱讀關於關聯的Hibernate documentation,因爲您錯過了它們的內容,以及ORM實際允許的大部分內容,這是爲了能夠加載,導航和查詢對象的圖形。

+0

好吧,似乎是一個非常翔實的答案,謝謝,你能提供它,在這種情況下,我的問題應該如何解決?因爲在這種情況下,我認爲每次訪問都需要存儲Patient和SpiProfessional,而每個病人都有很多次訪問,所以如何正確映射它? –

+0

或者,如果我在每次訪問中都存儲了Patient和SpiProfessional對象,那麼它還可以嗎? –

+2

是的,沒關係。這就是Hibernate應該如何使用的原因。所有的關聯默認都是懶惰的,所以加載一次訪問只會加載訪問表中的列,直到你調用'getPatient()',它會自動加載患者數據並返回。 –

相關問題