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





Odpovedet emailem