-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 posts ] 
Author Message
 Post subject: Many to Many bidirektional
PostPosted: Tue Jan 20, 2009 11:10 am 
Beginner
Beginner

Joined: Mon Dec 29, 2008 3:25 pm
Posts: 20
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ß


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jan 20, 2009 5:29 pm 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
1+2) Liegt am many-to-many, eine Seite muss die Kontrolle haben, wird über das mappedBy definiert

Siehe http://www.hibernate.org/hib_docs/annot ... ollections

Quote:
2.2.5.3.3. Many-to-many
2.2.5.3.3.1. Definition

A many-to-many association is defined logically using the @ManyToMany annotation. You also have to describe the association table and the join conditions using the @JoinTable annotation. If the association is bidirectional, one side has to be the owner and one side has to be the inverse end (ie. it will be ignored when updating the relationship values in the association table):
...
We've already shown the many declarations and the detailed attributes for associations. We'll go deeper in the @JoinTable description, it defines a name, an array of join columns (an array in annotation is defined using { A, B, C }), and an array of inverse join columns. The latter ones are the columns of the association table which refer to the Employee primary key (the "other side").

As seen previously, the other side don't have to (must not) describe the physical mapping: a simple mappedBy argument containing the owner side property name bind the two.


3) Wenn Du damit eine separate ID meinst, die bräuchtest Du eigentlich nur wenn die Zwischentabelle ein eigenes Objekt sein sollte, solange nur die beiden KEYs der anderen Tabellen eingetragen werden müssen gehts auch so
Beide KEYs gemeinsam als Primärschlüssel zu benutzen würde halt automatisch doppelte Einträge verhindern, was nicht unbedingt gewollt ist.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 21, 2009 10:46 am 
Beginner
Beginner

Joined: Mon Dec 29, 2008 3:25 pm
Posts: 20
zu 1) Ok also beidseitiges eintragen ist nicht möglich gut zu wissen...
Aber was meinst du wird über das mappedBy geregelt???
Ist die Seite wo das mappedBy hat die Kontollseite oder die wo die JoinTable Annotation hat?????

zu 2)
ja ich wollte ein zusammen gesetzten Schlüssel von beiden IDs, damit ich dopplete Einträge vermeiden kann... Ich dachte das ist normal das eine ZwischenTabelle einen zusammen gesetzten Schlüssel hat...
Mhm wie kann ich das erreichen, dass ich einen zusammengesetzteb PK erhalte????

Auf jeden Fall danke


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 21, 2009 12:55 pm 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
1) Das mappedBy gibt an welche Seite für die Verbindung zuständig ist
mappedBy="authors" heisst, dass book.authors hinzufügen darf, deshalb geht auch addAuthorToBook

2) Bin ich überfragt, am besten im Forum suchen, dass hab ich schon irgendwo gesehen
In der Datenbank direkt kannst Du das auf jeden Fall mit create index unter angabe beider spalten


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jan 21, 2009 8:37 pm 
Beginner
Beginner

Joined: Mon Dec 29, 2008 3:25 pm
Posts: 20
zu 1)das heißt wenn ich auf der anderen Seite mappedBy="books" mache
dann kann ich bei author.books einfügen???
muss ich mal versuchen...

zu2) ok danke werd mal schauen... muss ich da noch ein annotation einfügen oder was fehlt mir?


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 22, 2009 6:24 am 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
1) Ja aber es sollte nur auf einer Seite definiert sein, dh dann das mappedBy="authors" rausnehmen

2) Ich weiss nicht wie das mit den Annotations geht, bitte nachlesen


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 22, 2009 10:36 am 
Beginner
Beginner

Joined: Mon Dec 29, 2008 3:25 pm
Posts: 20
danke ich versuch mal mein glück =)

EDIT irgendwie find ich dazu nicht (zu 2)...


Top
 Profile  
 
 Post subject:
PostPosted: Thu Feb 19, 2009 6:36 pm 
Newbie

Joined: Thu Feb 19, 2009 6:29 pm
Posts: 1
Bin gerade mit dem einem ähnlichen Problem auf diesen Post gestolpert. Falls du das noch nicht selber gelöst hast:

zu 2.: wenn du deine List<Author> bzw. List<Book> durch die entsprechenden Sets ersetzt, erzeugt Hibernate für dich automatisch einen zusammengesetzten Key.

zu 1.: Da bei dir die Klasse Buch die eigentliche Arbeit der Relation übernimmt, musst du jedesmal, wenn du ein Buch zu einem Autor hinzufügst auch den Autor zu dem Buch hinzufügen. Sinnvoller ist es sicherlich, vor dem Speichern eines Autors über seine Bücher zu iterieren und diesen dann den Autor hinzuzufügen. Dann hast du korrekte Daten.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.