-->
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.  [ 4 posts ] 
Author Message
 Post subject: Many to Many Relation, Join-Tabelle wird nicht gepflegt???
PostPosted: Wed Jan 25, 2006 2:58 pm 
Newbie

Joined: Wed Jan 25, 2006 2:04 pm
Posts: 2
Hallo Leute,

sitze schon seit Tagen vor einem Problem (Hibeernate vs. 2.1.6).

Folgendes soll realisiert werden.

Produkte gehörhen zu mehreren Kategorien.
Kategorien beinhalten mehrere Produkte.

Das mapping sieht folgendermasen aus:

Code:
*** Produkt***
...
<set name="categories" table="rel_product_category" cascade="save-update">
  <key>
    <column name="rel_product_id"/>
  </key>
  <many-to-many class="de.vislabor.hibernate.Category" column="rel_category_id"/>
</set>

*** Kategorie ***
...
<set name="products" table="rel_product_category" cascade="save-update">
  <key>
    <column name="rel_category_id"/>
  </key>
  <many-to-many class="de.vislabor.hibernate.Product" column="rel_product_id"/>
</set>


Mit folgendem Code will ich nun ein Testprodukt samt Kategorie hinzufügen:

Code:
  // Get a new createt product
  Product prod = prodForm.getProduct();
  session.save(prod);           
           
  // Create a category manually
  Category cat = new Category("Category_1", null, null);           
  // Persist the category
  session.save(cat);
           
  prod.getCategories().add(cat);           
  session.update(prod);
           
  session.close();


Daraufhin ist zwar sowohl das Produkt als auch die Kategorie vorhanden, allerdings fehlt der Eintrag in der Join-Tabelle (rel_product_category).


Ich habe auch schon alle möglichen anderen Reihenfolge zur Generierung der Objekte versucht, nichts hat geholfen (egal ob auf der inversen Seite oder nicht).

Für Hilfe wäre ich wirklich sehr dankbar!


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 26, 2006 7:58 am 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
1)
Du musst das auf beiden Seiten setzen, sonst unterscheidet sich die Kategorie in der session von der Datenbank
Code:
prod.getCategories().add(cat);
cat.getProducts().add(prod);

2)
Ich sehe nirgendwo den Beginn einer Transaction oder ein Commit.
Hast Du autocommit konfiguriert?
3)
wenn Du die Einträge neu erstellst reicht
Code:
prod.getCategories().add(cat);
cat.getProducts().add(prod);
session.save(prod); //cat wird ja cascaded

Gruß Sebastian

_________________
Best Regards
Sebastian
---
Training for Hibernate and Java Persistence
Tutorials for Hibernate, Spring, EJB, JSF...
eBook: Hibernate 3 - DeveloperGuide
Paper book: Hibernate 3 - Das Praxisbuch
http://www.laliluna.de


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jan 26, 2006 2:22 pm 
Newbie

Joined: Wed Jan 25, 2006 2:04 pm
Posts: 2
Hi,

vielen, vielen Dank für die Unterstützung. Jetzt funktionierts!
Da glaubt man der Fehler sei irgendetwas kompliziertes und sucht an den unmöglichsten Stellen. Dabei hab ich einfach nur bot und commit vergessen.
Vermutlich konnten die einzelnen Objekte auch so gespeichert werden da hierfür ja kein zusammenhang bestehen muss, für die Relation allerdings müssen beide Objekte gleichzeitig im persistenten Zustand sein, was nur über eine Transaktion zu gewährleisten ist.

Hier nun die korrekte Version.

Code:

Transaction tx =  session.beginTransaction();
            // Get a new createt product
            Product prod = prodForm.getProduct();

            // Create a category manually
            Category cat = new Category("Category_1", null, new HashSet());           
            prod.getCategories().add(cat);
                       
            cat.getProducts().add(prod);
                       
           
            // Persist the category
            session.save(prod);
            tx.commit();
            session.close();


Bekomme zwar jetzt noch ne "Could not execute JDBC batch update
"
Exception, weil der Datensatz zweimal eingefügt wird, das sollte ich aber schnell Lösen können. (Lieber doppelt als gar nicht:-))

Vielen Dank nochmal,

Gruss Mischa


Top
 Profile  
 
 Post subject:
PostPosted: Sat Jan 28, 2006 4:27 pm 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
Du must inverse="true" auf einer Seite setzen!
Ein Rating wäre auch nett ;-)
Gruß Sebastian

_________________
Best Regards
Sebastian
---
Training for Hibernate and Java Persistence
Tutorials for Hibernate, Spring, EJB, JSF...
eBook: Hibernate 3 - DeveloperGuide
Paper book: Hibernate 3 - Das Praxisbuch
http://www.laliluna.de


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 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.