Ahoj,
>Mám dvě tabulky
Máš objekt "klient" a objekt "adresa". Nejprve je objekt pak teprve SQL
tabulka. SQL tabulka je něco co je na pozadí a v optimálním případě se o
to vůbec nestaráš. Z hlediska výkonu se sice provádí SQL modifikace ale
to je věc jiná - pro začátek je lepší zůstat na úrovni objektů a jen
dohlížet že v SQL vzniká co má.
>@Entity
>public class Klienti implements Serializable {
Objektem (entitou) je pro Tebe "klient", nikoliv "klienti". Pokud to moc
vadí tak SQL tabulku si můžeš přejmenovat anotací @Table na množné číslo
aby se SQL tabulka jmenovala "klienti".
K tomu získání klíče nově vloženého klienta:
existují dvě možnosti na uložení entity (klient) do úložiště přes entity
manager.
entityManager.persist(klient) a entityManager.merge(klient)
Ta druhá metoda (merge) vrací změněný objekt a tam máš vyplněn toužebně
očekávaný ID.
Nicméně u TopLinku pokud mně paměť neklame to v tomto případě
nepotřebuješ.
Zkus schematicky toto:
Klient klient = new Klient();
klient.nazev = "Walt Disney";
List<Adresa> kolekce = new ArrayList<Adresa>();
{
Adresa a = new Adresa();
a.setKlient(klient); // !!!!!!!!!!!!!!!
a.setJmeno("Mickey Mouse");
kolekce.add(a);
}
{
Adresa a = new Adresa();
a.setKlient(klient); // !!!!!!!!!!!!!!!
a.setJmeno("Kacer Donald");
kolekce.add(a);
}
klient.setAdresy(kolekce);
Klient zalozenyKlient = em.merge(klient);
Všimni si, ze vůbec nevolám adresa.persist() - to dělá samotné JPA -
požádal jsi o uložení _entity_ Klient a ta má v kompozici objekty Adresa
(a je povolen CASCADE).
Zkus to.
Leoš