Nevím, jestli to v tomhle konkrétní případě pomůže, ale fetchStrategy se dá změnit i v jednotlivé query v HQL nebo Criteria API. Možná se vyhnete psaní native SQL.
HQL: left join fetch x.collection CriteriaAPI criteria.setFetchMode("collection", FetchMode.JOIN) Petr On 16/11/2012, Arnošt Hrdina <hrdina.arn...@elvoris.cz> wrote: > Vážení, > > používám Hibernate a v některých případech jsem se nevyhnul použití > nativní sql. > Aby mi v závislostech LAZY negeneroval hibernate jednotlivé sql příkazy, > což při širším seznamu výsledku představuje neúnosný čas, > napsal jsem nativní sql příkaz, který by měl vše načíst naráz i do > závislých entit i pro entity, které jsou definovány jako LAZY. > > Mám ale problém v případě, relace ManyToMany, kdy je závislost definována: > > @Entity("entity") > class Entita ... { > > @ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, > CascadeType.MERGE }, > targetEntity = .... .PersonalDataImpl.class) > @JoinColumn(name = "`persData`") > private PersonalData persData; > > @ManyToMany( fetch = FetchType.LAZY, targetEntity = ..... > TariffImpl.class) > @JoinTable(name = "entita_tariffs", > joinColumns = {@JoinColumn(name = "entita_id") }, > inverseJoinColumns = @JoinColumn(name = "tariff_id")) > private List<Tariff> tariffs; > > ...... > > } > > Dále použiji nativní select > > String cmd = > "Select {s.*}, {pd.*}, {t.*} from entita en > join PersDate pd on pd.entita_id=en.id > left join entita_tariffs ents on ....... > join Tariff t on ....." > > > A načítám > > Session session = (Session) getEntityManager().getDelegate(); > > SQLQuery query = session.createSQLQuery(cmd) > .addEntity("en", InsuredSubjectImpl.class) > .addJoin("pd","en.persData") > .addJoin("t","en.insuredTariffs"); > > EnttyManager je injektován Springem, ale to nejspíš nemá vliv. > Problém je, že se mi Hibernate tom případě z {t.*} vygeneruje na > t.entita_tariffs_entita_id, t.entita_tariffs_tariffs_id, t.id, t. ... > další pole z tabulky Tariff. > Jenže t.entita_tariffs... jsou pole z tabulka entita_tariff, která > tabulky spojuje tabulky Entita a Tariff a pochopitelně v tabulce Tariff > neexistuje a havaruje. > Pokud je jednoduchá závislost, jako .addJoin("pd","en.persData"), tak > vše funguje správně. > Nepřišel jsem na způsob, jak to zapsat a příklad mi Dr.Google též > neposkytl. > Neřešil jste prosím pánové tento problém někdo? > > Děkuji předem za radu a pomoc. > > Arnošt > > >