Hirdetés

Keresés

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

  • floatr
    veterán

    Köszönöm szépen!
    Az az egy nem világos most, hogy egyelőre egy tök szimpla lekérdezéshez, a példában szereplő két mezőt (account number és account type) ugyanúgy kell mappelnem az account osztályban, hogy melyik oszlopban van az adatbázisban? Én úgy szoktam, hogy nem bizom a hibernatere, hanem mindig megadom melyik adatbázis oszlophoz mappelje.

    Valahogy így:

    @Embeddable
    public class AccountId {
        private String accountNumber;
        private String accountType;
        ...
    }

    @Entity
    public class Account {
        @EmbeddedId
        @AttributeOverrides({
            @AttributeOverride(name="accountNumber", column=@Column(name="account_number")),
            @AttributeOverride(name="accountType", column=@Column(name="account_type"))
        })
        private AccountId id;
        ...
    }

    az @AttributeOverrides szekciót azért tettem bele, mert ezzel pontosan el tudod nevezni a DB mezőket. A hibernatenek van olyan NamingStrategy-je (jpa/component-path), hogy hajlamos elécsapni a generált neveknek prefixként azt, hogy "id_"

  • floatr
    veterán

    Köszi!
    Egy konkrét kérdésem is lenne.
    Van egy munkahelyi tábla, amiben nincsen auto increment ID, nincs semmilyen primary key sem. Szembesültem azzal (ha jól értem), hogy a hibernate megköveteli az egyértelmű azonosítást. Mivel nincs a táblában ID, ezért egy darab azonosítót nem tudok hozzárendelni. Olvastam, hogy van lehetőség összetett kulcs hozzárendélésére az EmbeddedID annotation-nel.
    Jól értem? Egy netes példában az volt, hogy egy külön osztályt hozok létre a kulcsnak, és itt jelölöm, hogy @Embeddable. De ez már beleszámít a mappingbe?

    Ebben a cikkben leírnak két lehetőséget, de én is használok több munkahelyi projekten összetett kulcsot. Az EmbeddedId-t javaslom, de pár dolgot nem árt észben tartani.
    Az ID-t így te adod meg, nem a hibernate generálja. Emiatt egy új rekord mentésénél (save/saveOrUpdate) a hibernate egy selectet fog kiadni, hogy leellenőrizze, van-e már azzal a kulccsal adat a DB-ben. Ezt ki lehet kerülni mondjuk egy EntityManager.persist(...) hívással egy custom repo implementációban, ha te tudod garantálni a PK egyediségét. Ha sok adatot importálsz, problémát tud okozni.
    Az ilyen táblák általában kapcsoló/kapcsolatleíró táblák, és az összetett kulcs elemei külső kulcsok (FK), amik más táblákra mutatnak. Ilyenkor a hibernate csak trükközve tudja leírni a relációt másodlagos mappeléssel, vagy a kulcsban mappelt relációval, bár nem mindig van szükség arra, hogy össze tudj kapcsolni kódban is két objektumot.

  • floatr
    veterán

    Sziasztok

    Tudtok esetleg egy jó tutorialt Hibernate-hez? Amiket eddig találtam, egyikből sem jutottam közelebb a témához.

    Köszönöm!

    Biztosan vannak jobb források, de sok év után is általában a Baeldung-on kötök ki, ha valamire nem emlékszem. Itt van egy Spring Data JPA guide lista, sima hibernate-et kezdésnek nem annyira ajánlanám. Érdemes a cikkek alján lévő githubos példákat is végignézni.

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