I’m trying to do many-to-many mapping, but have a problem with a code below. Tables created with this code looks fine, foreign keys are added properly. The problem occurs when I’m trying to create related objects and save them to db. After lunching app I have one row in table KURS, one row in table KATEGORIE, but the third table – KURSY_KATEGORIE is empty 🙁
Table1:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2012-11-08 11:48:42 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="model.Kurs" table="KURS" node="kurs">
<id name="id" type="long">
<column name="ID_KURSU" />
<generator class="native" />
</id>
...
<set cascade="save-update" name="kategorie" inverse="true" lazy="true" table="KURSY_KATEGORIE">
<key foreign-key="FK_KATEGORIE_KURSY">
<column name="ID_KURSU" />
</key>
<many-to-many class="model.Kategoria" column="ID_KATEGORI"/>
</set>
</class>
</hibernate-mapping>
Table2:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2012-11-08 11:48:42 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="model.Kategoria" table="KATEGORIA" node="kategoria">
<id name="id" type="long">
<column name="ID_KATEGORI" />
<generator class="native" />
</id>
...
<set cascade="save-update" name="kursy" table="KURSY_KATEGORIE" inverse="true" lazy="true">
<key foreign-key="FK_KURSY_KATEGORIE">
<column name="ID_KATEGORI" />
</key>
<many-to-many class="model.Kurs" column="ID_KURSU"/>
</set>
</class>
</hibernate-mapping>
And .java file:
Session session = SESSION_FACTORY.openSession();
Transaction tx = session.beginTransaction();
GregorianCalendar Data_rozp = new GregorianCalendar();
Kategoria cat1 = new Kategoria("Kategoria1");
Set<Kategoria> kategorie = new HashSet<Kategoria>(3);
kategorie.add(cat1);
Kurs k1 = new Kurs(Data_rozp, "kurs1", 100);
Set<Kurs> kursy = new HashSet<Kurs>(1);
kursy.add(k1);
cat1.setKursy(kursy);
k1.setKategorie(kategorie);
session.save(cat1);
session.save(k1);
tx.commit();
session.close();
Try changing:
To:
And:
To:
I’m surprised that hibernate does not throw an exception for invalid configuration (both ends can’t be set as inverse – one must be the owner)