2012-12-30 8 views
9

के गेटर को कॉल करने में हुआ, मुझे लगता है कि यह त्रुटि हो रही है और मुझे नहीं पता कि मुझे यह त्रुटि क्यों मिल रही है। मुझे यह भी समझ में नहीं आता कि क्यों हाइबरनेट को उपयोगकर्ता वर्ग के लिए गेटटर की आवश्यकता है क्योंकि यह उस वर्ग के साथ सीधे किसी भी कार्रवाई को नहीं करना चाहिए ...हाइबरनेट - IllegalArgumentException एक कक्षा

2012-12-30 09: 38: 56,713 [मुख्य ] ERROR org.hibernate.property.BasicPropertyAccessor $ BasicGetter - HHH000122: अवैध श्रेणीकरण कक्षा में अपवाद: com.nortal.pirs.datamodel.User, संपत्ति का गेटर विधि: idUser 2012-12-30 09: 38: 56,714 [मुख्य] ​​ERROR कॉम .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 है, लंबे समय से इस प्रकार का है और रोगी की यात्रा इस बात का आईडी माना जाता है जो जोड़ने की कोशिश कर यह त्रुटि आती है के लिए पंजीकृत किया जा रहा है, विधि जहां मैं इस (कक्षा 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: (यह एक, कि कार्रवाई में वास्तव में होना चाहिए, मैं भी समझ में नहीं आता क्यों जरूरतों हाइबरनेट उपयोगकर्ता के लिए गेटर ...)

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

आप हाइबरनेट को बता रहे हैं कि विज़िट क्लास में रोगी वर्ग (और दो अन्य कक्षाओं के साथ) के साथ कई से एक सहयोग है। इसमें ऐसा कोई सहयोग नहीं है। आप इस तरह के एक assciation था, तो उस पर जाएँ वर्ग होते हैं

private Patient patient; 

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

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

इसके बजाय, क्या आप अपनी यात्रा इकाई में एक रोगी की आईडी है। यह एक संघ का गठन नहीं करता है।

Hibernate documentation एसोसिएशन के बारे में पढ़ें, क्योंकि आप जो चूक गए हैं, उन्हें याद किया है, और एक ओआरएम वास्तव में क्या अनुमति देता है, जो ऑब्जेक्ट्स के ग्राफ को लोड, नेविगेट और क्वेरी करने में सक्षम होना है।

+0

ठीक है, एक बहुत ही जानकारीपूर्ण उत्तर लगता है, धन्यवाद, क्या आप इसे आपूर्ति कर सकते हैं, इस मामले में मेरी समस्या का समाधान कैसे किया जाना चाहिए? क्योंकि इस मामले में मैंने सोचा था कि यह हर एक दौरे के लिए रोगी और स्पाइप्रोफेशनल को स्टोर करने के लिए बहुत अधिक ओवरहेड होगा, जबकि प्रत्येक रोगी के पास कई दौरे हैं ... मैं इसे सही तरीके से कैसे मैप कर सकता हूं? –

+0

या यह भी ठीक रहेगा, अगर मैंने प्रत्येक विज़िट के अंदर रोगी और स्पाई व्यावसायिक वस्तुओं को संग्रहीत किया है? –

+2

हां, यह ठीक रहेगा। इस तरह हाइबरनेट का उपयोग किया जाना चाहिए।सभी संघ डिफ़ॉल्ट रूप से आलसी हैं, इसलिए एक विज़िट लोड करने से केवल विज़िट टेबल में कॉलम लोड हो जाएंगे, जब तक कि आप उस पर 'getPatient()' नहीं कहें, जो स्वचालित रूप से रोगी डेटा को पारदर्शी रूप से लोड कर देगा और इसे वापस कर देगा। –

संबंधित मुद्दे