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š

Odpovedet emailem