Zdravím!

Nevím, jak u hibernate, ale v JTA se při dědičnosti vždy vytváří
discriminator column - defaultně se tuším jmenuje dtype.
Sloupeček se vytváří i pro InheritanceType.JOINED.

Lze to ovlivnit pomocí anotací.

U třídy Base
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="dtype",
discriminatorType=DiscriminatorType.STRING, length=32)

U Třídy odvozené
@DiscriminatorValue(value="Odvozena")

více informací v dokumentaci u JSR220
http://jcp.org/en/jsr/detail?id=220

fafi

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

Odpovedet emailem