Avatar billede krukken Mester
21. februar 2006 - 18:33 Der er 19 kommentarer og
1 løsning

Fejl ved hentning af data i Mysql via Hibernate

Hej

Jeg har følgende Hibernate mapperfile:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="Person" table="PERSON">
    <id name="id" type="long" column="PERSON_ID">
        <generator class="native"/>
    </id>
    <property name="_FirstName" column="FirstName"/>
    <property name="_LastName" column="LastName"/>
    <property name="_MiddleName" column="MiddleName"/>
    <property name="_SSN" column="SSN"/>
    <component name="m_Address" class="Address">
        <property name="_City" column="City"/>
        <property name="_Country" column="Country"/>
        <property name="_Street" column="Street"/>
    </component>
    <joined-subclass name="Doctor" table="DOCTOR">
        <key column="PERSON_ID"/>
        <property name="_OfficeNumber" column="OfficeNumber"/>
        <property name="_PagerNumber" column="PagerNumber"/>
        <set name="m_Patient" table="DOCTOR_PATIENT">
            <key column="ref_DOCTOR_ID"/>
            <many-to-many column="ref_PATIENT_ID" class="Patient"/>
        </set>
    </joined-subclass>
    <joined-subclass name="Patient" table="PATIENT">
        <key column="PERSON_ID" />
        <property name="_MobilePhoneNumber" column="MobilePhoneNumber"/>
        <property name="_PhoneNumber" column="PhoneNumber"/>
        <set name="m_doctors" table="DOCTOR_PATIENT" inverse="true">
            <key column="ref_PATIENT_ID"/>
            <many-to-many column="ref_DOCTOR_ID" class="Doctor"/>
        </set>
        <set name="m_Record" table="PATIENT_RECORD">
            <key column="ref_PATIENT_ID"/>
            <many-to-many column="ref_JOURNAL_ID" class="Record"/>
        </set>
    </joined-subclass>
</class>

</hibernate-mapping>

Når jeg forsøger at hente en Patient med:
Patient aPatient = (Patient) session.load(Patient.class, patientId);

får jeg følgende fejl:
2006-02-21 18:29:52,343 ERROR JDBCExceptionReporter - Statement parameter 1 not set.
could not load an entity: [Patient#14]

Hvad kan det skyldes? Entryen findes i databasen, og Hibernate er sat rigtigt op, så det er sandsynligvis en fejl i mapperfilen.
Avatar billede fsconsult.dk Nybegynder
21. februar 2006 - 18:40 #1
får du ikke mere exceptions?    jeg tror aldring jeg har set en JDBC exception fra hibernate ellers...

ellers er det i joined-subclass/key-column der kan være noget ... plejer at bruge discrimenator istedet.

iøvrigt kan du med xdoclet2 få din mapperfil genereret ud fra din pojo klasse... ;-)
Avatar billede krukken Mester
21. februar 2006 - 18:43 #2
Nope - jeg får ikke andet end det jeg har skrevet ovenfor.

Hvordan får jeg genereret mapperfil udfra xdoclet2? Har du et link til en howto?
Avatar billede fsconsult.dk Nybegynder
21. februar 2006 - 19:03 #3
jeg fandt flg.  http://www.downside.ch/blog/?page_id=37

det forudsætter iøvrigt at du benytter enten ANT eller MAVEN til at bygge med
Avatar billede fsconsult.dk Nybegynder
21. februar 2006 - 19:04 #4
syntes ellers jeg får milelange stacktrace ved hibernatefejl ... underligt
Avatar billede fsconsult.dk Nybegynder
21. februar 2006 - 19:16 #5
hov, det link var til hibernate2, sorry .... prøv http://www.hibernate.org/284.html istedet
Avatar billede krukken Mester
21. februar 2006 - 20:39 #6
Jeg får følgende fejl når jeg udskriver stacktrace:
2006-02-21 20:37:57,781 ERROR JDBCExceptionReporter - Statement parameter 1 not set.
org.hibernate.exception.GenericJDBCException: could not load an entity: [Patient#14]
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:91)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:79)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:1799)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:93)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:81)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:2730)
    at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:365)
    at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:346)
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:123)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:82)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:891)
    at org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:849)
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:62)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
    at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
    at Patient$$EnhancerByCGLIB$$f29bbf15.toString(<generated>)
    at java.lang.String.valueOf(String.java:2577)
    at java.io.PrintStream.print(PrintStream.java:616)
    at java.io.PrintStream.println(PrintStream.java:753)
    at Test.AddRecordToPatient(Test.java:27)
    at Test.main(Test.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
Caused by: java.sql.SQLException: Statement parameter 1 not set.
    at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1027)
    at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:675)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1027)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)
    at org.hibernate.loader.Loader.doQuery(Loader.java:662)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:1785)
    ... 23 more

Process finished with exit code 0
Avatar billede arne_v Ekspert
21. februar 2006 - 20:43 #7
Avatar billede krukken Mester
21. februar 2006 - 20:49 #8
Nope - det giver samme fejl.
.String.valueOf(String.java:2577) kunne godt virke til at der bliver forsøgt at konvertere en string til en int. Jeg forsøger at sætte typer på alle properties i mapperfilen.
Avatar billede fsconsult.dk Nybegynder
21. februar 2006 - 20:51 #9
og patientId er en long ?
Avatar billede fsconsult.dk Nybegynder
21. februar 2006 - 20:52 #10
hvordan ser din Person.java og Patient.java ud?
Avatar billede krukken Mester
21. februar 2006 - 20:53 #11
Jeps - patientID var en long før. Det har jeg ændret, men det giver det samme resultat.
Avatar billede fsconsult.dk Nybegynder
21. februar 2006 - 20:55 #12
ændret?    patientId skal være en long/Long iflg. din .hbm fil
Avatar billede krukken Mester
21. februar 2006 - 21:03 #13
Ved at bruge Patient aPatient = (Patient) session.load(Patient.class, new Long(14)); får jeg hentet en entry i databasen. Præcist det modsatte af problem at det link du angav:-)
Avatar billede fsconsult.dk Nybegynder
21. februar 2006 - 21:06 #14
men det virker nu? 
datatyperne i .java filerne skal være mere eller mindre de samme som i .hbm.xml filerne ...
Avatar billede krukken Mester
21. februar 2006 - 21:23 #15
Jeps

Det virker når jeg gør det: new Long(PatientID)
Ligger du et svar?
Avatar billede fsconsult.dk Nybegynder
21. februar 2006 - 21:28 #16
jups
Avatar billede krukken Mester
21. februar 2006 - 21:30 #17
Og mange tak for hjælpen. Jeg havde set mig helt blindt på den fejl efter rigitig mange timer.
Avatar billede fsconsult.dk Nybegynder
21. februar 2006 - 21:34 #18
velbekomme!  men prøv at kigge om du kan få xdoclet2 til at virke med din opsætning, det vil gøre livet lidt lettere ;-)
Avatar billede krukken Mester
21. februar 2006 - 21:41 #19
Det har du nok helt ret i. Men dette er til et skoleprojekt, hvor det er vigtigt at forstå mappingfilerne. Derfor synes jeg det er en dårlig ide at bruge det. Men du har ret i at det nok ellers er smartere at bruge xdoclet2:-)
Avatar billede krukken Mester
22. februar 2006 - 01:31 #20
Jeg har lige endnu et spørgsmål, hvis du stadigvæk lytter efter her. Jeg får følgende fejl når jeg bruger "<property name="hbm2ddl.auto">create</property>"

2006-02-22 01:28:39,968 ERROR SchemaExport    - Unsuccessful: create table PERSON (PERSON_ID bigint generated by default as identity (start with 1), FirstName varchar(255), LastName varchar(255), MiddleName varchar(255), SSN varchar(255), City varchar(255), Country varchar(255), Street varchar(255), primary key (PERSON_ID))
2006-02-22 01:28:39,968 ERROR SchemaExport    - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'generated by default as identity (start with 1), FirstName varchar(255), LastNam' at line 1

Ved du hvad de betyder?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester