Dobry den,
myslim, ze v tom chyba neni, protoze vlastnikem je book a na strane
book je vztah nastaven spravne (i kdyz samozrejme doporucuji
nastavovat vztah na obou stranach).
V cem je chyba ovsem nevim, protoze mne to funguje. Po provedeni
metody addAuthor() se vztah do DB zapise:
public void addAuthor() {
Author author1 = em.find(Author.class, Long.valueOf(2));
Book book = em.find(Book.class, Long.valueOf(4));
book.getAuthors().add(author1);
}
(Volani merge() je zbytecne, protoze entity jsou v managed stavu).
Z.T.
--
Zdenek Tronicek
Department of Computer Science and Engineering
Prague tel: +420 2 2435 7410
http://cs.felk.cvut.cz/~tronicek
Quoting Ondřej Fafejta <[EMAIL PROTECTED]>:
Zdravím!
Myslím si, že problém je v bidirection ManyToMany vztahu.
Musíte propojit vztahy oboustraně.
Vyřešit to jde například tak, že se napíše nová metoda do service
pro propojení knih a autorů.
např.
public void addBookToAuthor(int bookId, int authorId){
Book book = findBookById(bookId);
Author author = findAuthorById(authorId);
book.getAuthors().add(author);
author.getBooks().add(book);
}
případně propojit oboustraně Book a Author v metodě save.
Fafi
[EMAIL PROTECTED] napsal(a):
Dobrý den
nemuhu najít problém.
Mám 2 entity v asociaci ManyToMany.
Pokud ukládám nový objekt - není ještě v DB. Uloží se správně i
asociovaná kolekce.
tedy:
autor1 = service.find(1);
autor2 = service.find(2);
book = new Book();
book.addAutor(autor1);
book.addAutor(autor2);
service.save(book);
//OK
pokud, ale objekt Book už je persistovaný a přidám do kolekce další
objekty ,
tyto objekty se do DB neuloží. Nemohu přijít na to kde dělám chybu:
autor4 = service.find(4);
book = service.find(1);
book.addAutor(autor4);
service.save(book);
//autor4 se do asociované tabulky nepřidá
---------------------------------------------------------------
Zde přikládám asociace:
@ManyToMany
@JoinTable(name = "Autor_Book",
joinColumns = [EMAIL PROTECTED](name="bookId")},
inverseJoinColumns = [EMAIL PROTECTED](name="autorId")}
)
private List<Autor> autors = new ArrayList();
@ManyToMany(mappedBy="autors")
private List<Book> books = new ArrayList();
metoda save:
public void save(Book book) {
if (book.getId() == null) {
entityManager.persist(book); } else {
entityManager.merge(book); }
}
-----------------------------------------------------
Děkuji za pomoc
Tomáš Jurman