Hibernate: insert into Item (name, id) values (?, ?) Hibernate: delete from OrderTab_Item where OrderTab_id=? Hibernate: insert into OrderTab_Item (OrderTab_id, items_id) values (?, ?) Hibernate: insert into OrderTab_Item (OrderTab_id, items_id) values (?, ?) Hibernate: insert into OrderTab_Item (OrderTab_id, items_id) values (?, ?) Hibernate: insert into OrderTab_Item (OrderTab_id, items_id) values (?, ?)Czyli w momencie wstawienia jakiegoś wiersza do listy, Hibenrate usuwa wszystkie relacje a następnie z powrotem je dodaje. W moim przykładzie dodajemy 1 element do listy już 3 elementowej. W związku z tym Hibenrate postanowił usunąć wszystkie relacji a następnie po kolei dodał całkiem nowe 4 wiersze. Przykład encji oraz kodu który który dodaje do encji widzimy poniżej.
Encje w relacji many-to-many.
@Entity @Table(name="OrderTab") public class Order implements Serializable { @Id @GeneratedValue private Long id; private String name; @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER) private List- items; // ... GET and SET }
@Entity public class Item implements Serializable { @Id @GeneratedValue private Long id; private String name; // ... GET and SET }Prosta metoda dodająca Item do Orderu.
public void addItem(long orderId, Item item) { Order o = em.find(Order.class, orderId); o.getItems().add(item); em.merge(o); }Rozwiązanie problemu
Wystarczy zmienić typ kolekcji w której przechowywujemy elementy z java.util.List na java.util.Set i wszystko będzie działać zgodnie z oczekiwaniami. Encja Order po zmianie wygląda tak:
@Entity @Table(name="OrderTab") public class Order implements Serializable { @Id @GeneratedValue private Long id; private String name; @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER) private Seta log w konsoli tak:- items; // ... GET and SET }
Hibernate: insert into Item (name, id) values (?, ?) Hibernate: insert into OrderTab_Item (OrderTab_id, items_id) values (?, ?)Pamiętajcie tylko że jak korzystacie ze zbiorów zamiast list, to należy doimplementować metody equals i hashCode.
Brak komentarzy:
Prześlij komentarz