PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Hibernate] n:m Problem beim Speichern



nul
01-02-2007, 19:47
Folgende Situation,
ich habe die Klasse GroupObject und AuthorisationObject wobei zwischen den beiden eine n:m Beziehung besteht. Das ganze sieht so aus:


public class GroupObject extends HibernateDatabaseObject {

/**
*
*/
private static final long serialVersionUID = -7225994169601497795L;

private int gid;

private String name;

private boolean locked;

private Collection<HibernateDatabaseObject> authorisation;

public GroupObject() {
super();

this.locked = false;
this.authorisation = new HashSet<HibernateDatabaseObject>();
}
// die getter & setter spar ich mir mal :)
}
und

public class AuthorisationObject extends HibernateDatabaseObject {

public static final String LOGIN_ALLOWED = AuthorisationObject.class.getSimpleName()+".LOGIN_ALLOWED";
public static final String ADMIN_ALLOWED = AuthorisationObject.class.getSimpleName()+".ADMIN_ALLOWED";

private static final long serialVersionUID = 7935713947537379167L;

private int auid;

private String name;

public AuthorisationObject() {
this(null);
}

public AuthorisationObject(String name) {
super();

this.name = name;
}
// getter & setter
}

Die zugehoerigen Hibernate-Dateien sind:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="moe.web.tavern.map.GroupObject" table="GroupObject">

<id name="gid" type="int" column="GID" >
<generator class="increment"/>
</id>

<property name="name" not-null="true">
<column name="NAME" />
</property>

<property name="locked" type="java.lang.Boolean" not-null="true">
<column name="LOCKED" />
</property>

<set name="authorisation" table="GroupAuthorisationJoin" inverse="true">
<key column="KEY_GROUP"/>
<many-to-many column="KEY_AUTHORISATION" class="moe.web.tavern.map.AuthorisationObject"/>
</set>

</class>
</hibernate-mapping>
und

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
<class name="moe.web.tavern.map.AuthorisationObject" table="AuthorisationObject">

<id name="auid" type="int" column="AUID" >
<generator class="increment"/>
</id>

<property name="name" not-null="true">
<column name="NAME" />
</property>

</class>
</hibernate-mapping>
Das Gruppen-Objekt haelt also Referenzen auf die Authoritaeten, wenn ich das aber versuche zu speicher wird zwar das GroupObject und das AuthorisationObject gespeichert, die Tabelle GroupAuthorisationJoin gleibt aber leer :confused:
Beim speichern kommen folgende Funktionen zum Einsatz:

public static void store(SessionFactory factory,
HibernateDatabaseObject storeable) throws Throwable {
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();

if (storeable.getCollections() != null)
DbUtils.saveList(storeable.getCollections(), session);

session.save(storeable);
transaction.commit();
session.close();
}


private static void saveList(Collection<HibernateDatabaseObject> list,
Session session) throws Throwable {
for (HibernateDatabaseObject object : list) {
session.save(object);
}
}
und als Beispiel:

AuthorisationObject ao = new AuthorisationObject(AuthorisationObject.LOGIN_ALLO WED);
DbUtils.store(this.factory, ao);

AuthorisationObject hdo = (AuthorisationObject)DbUtils.load(this.factory, AuthorisationObject.class, ao.getAuid());

GroupObject go = new GroupObject();
go.setName("GROUP.LoginMembers");
go.setLocked(true);
go.addAuthorisation(hdo);

DbUtils.store(this.factory, go);
Nur will das nicht so funktionieren wie es soll.
Hibernate kennt die Datentypen auch, Mapping files sind korrekt angegeben. Fehlermeldungen bzw. Warnmeldungen krieg ich auch keine (log4j ist konfiguriert).

Hat vielleicht jemand den klareren Durchblick als ich in der Sache?
mfg
nul

nul
01-02-2007, 19:50
Achja, wenn das Thema mehr in den Datenbank-Bereich faellt, bitte verschieben!

nul
01-02-2007, 20:35
Koennt ihr mir sagen warum ich immer auf die Loesung komme, nachdem ich hier gepostet habe?
Erst such ich Stundenlang den Fehler, und keine 15 Minuten nachdem ich hier was von mir gegebenhabe, hab ich erfolg? :mad:

Naja, fuer die dies Interessiert, das Mapping hatte doch einen Fehler. In der Definition zum set muss der Name der Spalte gleich heissen wie das Attribut der Klasse bzw. wie es im Mapping-File zum anderen Objekt genannt wurde, also so:

<set name="authorisation" table="GroupAuthorisationJoin" inverse="false">
<key column="KEY_GROUP"/>
<many-to-many column="auid" class="moe.web.tavern.map.AuthorisationObject"/>
</set>