Dobry den,
protoze jste neuvedl jake mate mapovaci soubory pak velmi spatne muzeme
odhadnout kde je problem, ale rozhodne nebude v
kodu Hibernate, protoze pokud byste mel mapovani spravne, pak hibernate umi
dotaz takovy jaky je, dokonce natahne jak
zakazky tak rozsirene zakazky a vsechny se vsema sloupeckama. Dokonce se necha
napsat dotaz "select * from Object" a
ziskate vsechny persistentni objekty z db.
Diskriminator se pouziva v okamziku, kdy mapujete vice trid do jedne tabulky,
aby Hibernate dokazalo nejak odlisit tyto
ruzne instance od sebe. Diskriminator definujete vy v mapovani a pro kazdou
mapovanou tridu mu priradite hodnotu.
Takze ja bych rekl, ze v mapovani ten sloupecek mate, ale nemate jej v db
definovan.
Co vy na to?
Jirka
Karel Nagy napsal(a):
>
> Entita Zakazka ma vsechny sloupecky tabulky ZAKAZKY, az teprve
> ZakazkaRozsirena ma vice sloupecku v SQL - zaroven jsou tyto sloupecky
> zahrnuty i s mapovanim v entite ZakazkaRozsirena.
> Jeste je zajimave, ze chyba, kterou to vypisuje je
> "org.firebirdsql.jdbc.FBSQLException: Column name DTYPE not found in
> result set.". Sloupecek DTYPE nemame nikde v databazi ani v programu
> pouzit. Kdyz jsem hledal na google, tak DTYPE v Hibernate by melo byt
> "Dicriminator - The default discriminator value is now the entity name
> rather than the fully qualified class name (which means usually the
> unqualified class name)." Abych se priznal, tak nerozumim, k cemu to je
> dobre.
> Pri mapovani entity to tam u kazde pise:
> INFO AnnotationBinder:398 - Binding entity from annotated class:
> entity.Zakazka
> DEBUG Ejb3Column:161 - Binding column DTYPE unique false
> DEBUG EntityBinder:292 - Import with entity name=Zakazka
> INFO EntityBinder:420 - Bind entity entity.Zakazka on table ZAKAZKY
> DEBUG AnnotationBinder:950 - Setting discriminator for entity
> entity.Zakazka
> DEBUG AnnotationBinder:983 - Processing entity.Zakazka property annotation
> DEBUG AnnotationBinder:983 - Processing entity.Zakazka field annotation
> .....
> INFO AnnotationBinder:398 - Binding entity from annotated class:
> entity.ZakazkaRozsirene
> DEBUG EntityBinder:292 - Import with entity name=ZakazkaRozsirena
> DEBUG AnnotationBinder:983 - Processing entity.ZakazkaRozsirena field
> annotation
> ...
> Karel
>
> Lukas Barton napsal(a):
>> Ta query je polymorfni a vy nemate v ResultSetu sloupce pro vsechny
>> potomky.
>> Udelejte si predka AbstraktZakazky, ktery bude mit stejne mapovani
>> jako Zakazky a pak ze Zakazky a ZakazkyRozsirene udelejte jeho potomka.
>> Potom ta query na Zakazky nebude polymorfni a bude fungovat.
>>
>> Lukas
>>
>> Karel Nagy napsal(a):
>>> Dobry den,
>>> v desktopove aplikaci pouzivam jako persitence API Hibernate. Pro
>>> ziskavani dat pouzivam SQLQuery - "cisty" SQL a pridavam addEntity
>>> (Zakazka.class)
>>> Pro jednoduchost mam dve entity - Zakazka a ZakazkaRozsirena, ktera
>>> je zdedena od Zakazka.
>>> Zakazka obsahuje vsechny sloupecky tabulky ZAKAZKY z databaze.
>>> ZakazkaRozsirena ma rozsireny SQL o ruzne sloupecky, ktere ziskavam z
>>> dalsich tabulek, ale protoze puzivam SQL dotazy, tak formou: select
>>> ZAKAZKY.*, (select max(CENA) from OCENENI) as MAX_CENA from ZAKAZKY ...
>>>
>>> Pokud spustim kod nize, ve kterem neni vubec pouzita entita
>>> ZakazkyRozsirene - ta je pouze v konfuguracnim souboru, tak to ohlasi
>>> chybu - viz nize. Pokud z konfiguracniho souboru odstranim radek s
>>> mapovanim ZakazkyRozsirene, tak to probehe v poradku.
>>> Nevite v cem by mohla byt chyba? Ja uz to hledam druhy den a nemuzu
>>> na nic prijit
>>> Diky Karel
>>>
>>>
>>> hibernate.xml
>>> <mapping class="entity.Zakazky"/>
>>> <mapping class="entity.ZakazkyRozsirene"/>
>>>
>>> Kod
>>> Configuration configuration = new AnnotationConfiguration
>>> ().configure ("hibernate.xml");
>>> SessionFactory sessionFactory = configuration.buildSessionFactory ();
>>> Session session = sessionFactory.openSession ();
>>> SQLQuery q = session.createSQLQuery ("select * from ZAKAZKY");
>>> q.addEntity (entity.Zakazkyy.class);
>>> List<Zakazky> l = q.list ();
>>> session.disconnect ();
>>> sessionFactory.close ();
>>>
>>> Chyba
>>> Exception in thread "main"
>>> org.hibernate.exception.GenericJDBCException: could not execute query
>>> at
>>> org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
>>>
>>> at
>>> org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
>>>
>>> at
>>> org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
>>>
>>> at org.hibernate.loader.Loader.doList(Loader.java:2223)
>>> at
>>> org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
>>> at org.hibernate.loader.Loader.list(Loader.java:2099)
>>> at
>>> org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
>>> at
>>> org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
>>> at
>>> org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
>>>
>>> at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
>>> at NewMain.main(NewMain.java:25)
>>> Caused by: org.firebirdsql.jdbc.FBSQLException: Column name DTYPE not
>>> found in result set.
>>> at
>>> org.firebirdsql.jdbc.FBResultSet.findColumn(FBResultSet.java:1059)
>>> at
>>> org.firebirdsql.jdbc.FBResultSet.getField(FBResultSet.java:658)
>>> at
>>> org.firebirdsql.jdbc.FBResultSet.getString(FBResultSet.java:704)
>>> at org.hibernate.type.StringType.get(StringType.java:18)
>>> at
>>> org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
>>> at
>>> org.hibernate.type.NullableType.nullSafeGet(NullableType.java:189)
>>> at org.hibernate.loader.Loader.getInstanceClass(Loader.java:1442)
>>> at
>>> org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1284)
>>> at org.hibernate.loader.Loader.getRow(Loader.java:1206)
>>> at
>>> org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580)
>>> at org.hibernate.loader.Loader.doQuery(Loader.java:701)
>>> at
>>> org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
>>>
>>> at org.hibernate.loader.Loader.doList(Loader.java:2220)
>>>
>
--
Jiří Mareš (mailto:[EMAIL PROTECTED])
ČSAD SVT Praha, s.r.o. (http://www.svt.cz)
Czech Republic