Hirdetés

Új hozzászólás Aktív témák

  • Szmeby
    tag

    Vannak adatbázis entitásaim amik körbehivatkoznak egymásra, például MoviesEntity ismer csomó ActorsEntity-t és vica-versa. Ezeket az entitásokat akarom REST-en keresztük JSON-nel elérhetővé tenni, méghozzá úgy, hogyha jön egy GET request egy MoviesEntity-re, akkor fetchelje le a hozzátartozó Actorokat, Producereket, stb-t, de ne tovább. Ez sikerül is az alábbi módon:

    MoviesEntity:

    @JsonManagedReference
    private List<ActorsEntity> actors;

    ...

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "movies2actors", catalog = "movietime2", schema = "", joinColumns = @JoinColumn(name = "movieid", referencedColumnName = "movieid", nullable = false), inverseJoinColumns = @JoinColumn(name = "actorid", referencedColumnName = "actorid", nullable = false))
    public List<ActorsEntity> getActors() {
    return actors;
    }

    ActorsEntity:

    @JsonBackReference
    private List<MoviesEntity> movies;

    ...

    @ManyToMany(mappedBy = "actors") // LAZY fetching is default
    public List<MoviesEntity> getMovies() {
    return movies;
    }

    Ez rendben is van. Viszont azt is szeretném, hogyha valaki egy Actor-t kérne GET requesttel, akkor ugyan úgy kapja meg az 1 távolságra lévő kapcsolódó entitásokat is (pl milyen filmekben játszott).

    Erre nincs ötletem, nem is nagyon találtam neten semmit. Esetleg valaki tudja mi ilyenkor a teendő, vagy ha valaki jobban gúglizik, mint én, az is nagy segítség volna.

    conditional annotiation ha lenne, milyen jó lenne.

    Kicsit későn lövöm el a hsz-t, feltartottak. Talán ad ötletet.
    --------
    Szerintem fixen belőtt annotációkkal nem fog menni, mivel nem egyértelmű, hogy melyik fetch módot kell alkalmazni.
    Alap, hogy minden lazy. Mivel csak a REST hívás beérkezésekor tudod eldönteni, hogy adott esetben melyik kapcsolatot kell eager fetchelni, nincs mese, runtime ott helyben kell megmondanod neki.

    Erre sokféle módszer létezik, hogy melyik szép, azt nem tudom.

    1. Ha a user a filmre kíváncsi, előkeresed a filmet, majd ráhívsz a getActors() metódusra (ez úgy tudom meglöki a proxy-t és ha sessionben vagy, akkor feltölti az actorokkal is).

    2. Talán named query használatával (movie és actor joinnal) ez a bohóckodás egyszerűbbé tehető.

    3. Rémlik valami olyasmi, hogy JPA/Hibernate alatt runtime felülbírálható a fetch mód. De itt is áll, hogy minden lazy és szükség esetén adott hívásnál döntöd el, hogy mit nyomatsz eagerrel. Mintha valamiféle fetch profilt kellene ehhez létrehozni (ezzel jól megannotálva az entitást), és az entitás lekérésekor elég csak a profilra hivatkozni.

    4. ...

    Sajnos nagyon régen Hibernate-eztem, nem biztos, hogy ezek a legjobb megoldások, vagy hogy egyáltalán működnek.
    A hibernate doksit nézted már?

Új hozzászólás Aktív témák