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

Odpovedet emailem