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