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