allo,
ich möchte eine bidirektionale many to many beziehung zwischen 2 Klassen herstellen
1. Klasse
Code:
@Entity
@Table(name = "books")
public class Book {
private int id;
private List<Author> authors;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@ManyToMany(targetEntity= Author.class ,cascade = CascadeType.ALL)
@JoinTable(name = "authors_books",
joinColumns = @JoinColumn(name = "books_id"),
inverseJoinColumns = @JoinColumn(name = "authors_id"))
public List<Author> getAuthors() {
return authors;
}
public void setAuthors(List<Author> authors) {
this.authors = authors;
}
}
2. Klasse
Code:
@Entity
@Table(name = "authors")
public class Author {
private int id;
private List<Book> books;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@ManyToMany(mappedBy="authors",targetEntity= Book.class ,cascade = CascadeType.ALL)
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
}
3. TestKlasse
Code:
public class TestMain{
public static void main(String[] args) {
TestMain mgr = new TestMain();
mgr.addAuthorToBook(1, 2);
mgr.addBookToAuthor(1, 1);
HibernateUtil.getSessionFactory().close();
}
private void addAuthorToBook(int a, int b)
{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Author author = (Author) session.load(Author.class, a);
Book book = (Book) session.load(Book.class, b);
book.getAuthors().add(author);
System.out.println(book.getAuthors().size());
session.getTransaction().commit();
}
private void addBookToAuthor(int a, int b) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Author author = (Author) session.load(Author.class, a);
Book book = (Book) session.load(Book.class, b);
author.getBooks().add(book);
System.out.println(author.getBooks().size());
session.getTransaction().commit();
}
Also die Methode addAuthorToBook klappt wunderbar jedesmal wenn die aufgerufen wird hat das Buch nachher ein Author mehr drin und gibt diese Zahl auf auf der Konsole aus.
Die 2te Methode addBookToAuthor funktioniert leider nicht. Der Auhtor kann keine Bücher aufnehmen. Warum???
Der Author hat zwar alle Bücher die über die 1. methode geaddet werden, aber die über die 2 te methode gehen verloren.??
Hier in diesem Beispiel:
1. Transaktion :Erst wird der Author 1 geladen und dann dem Buch 2 hinzugefügt. Also hat das Buch 2 einen Author. Und der Author hat ein Buch.
2. Transaktion :Dann in der 2ten Methode wird Buch 1 geladen und dem Author hinzugefügt. Jetzt sollte Author 1 , 2 Bücher in seiner Liste haben(Buch 1 und 2). Er hat aber nur 1 Buch in seiner Liste und das ist buch 2 aus der 1. Transaktion.
3. Die Zwischentabelle authors_books hat keine Primär schlüssel weiß jemand warum??
Gruß