Witam.
Na początek kilka słów wyjasnien.
A mianowicie mam w bazie m.in. 2 tabelki:

Klient i Adres polączone relacja jeden-do-wielu. I odwzorowane sa w beanach encyjnych:

Klient

...
@OneToMany( fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "klient" )
    private Set<Adres> adres;
...

oraz

Adres

...
@ManyToOne @JoinColumn( name = "KLIENT_ID", referencedColumnName = "KLIENT_ID", insertable = false, updatable = false )
	private Klient klient= null;
...

I teraz tak. Bean Kient ma metody:

 public Set<Adres> adres getAdres(){
        return adres;
    }

    public void setAdres( Set<Adres> adres){
        this.adres= adres;
    }

I teraz przechodze do sedna :)
Dlaczego cos takiego:

Klient kl....

Set<Adres> zbior = new HashSet<Adres>();
Adres ad1 = new Adres();
ad1.set...*
Adres ad2 = new Adres();
ad2.set...
zbior.add( ad1 );
zbior.add( ad2 );
kl.setAdres(zbior);

*set.. oznacza metody Set() odpowiednich pol. Nie jest tylko ustawiane pole Id gdyz jego generowaniem zajmuje sie odpowiednia sekwencja z bazy danych.

w momencie wywolalnia :

EntityManager em;
em.merge(kl);

Wywala SQL error ze niby jakas wartosc stringowa ma nieodpowiednia dlugosc. Tylko ze jak dany Set ograniczne do jednego z rekorodow ad1 lub ad2 to juz jest ok. Wiec nie ma mowy ze ad1 lub ad2 zawieraja nie takie dane.