Hallo alle zusammen,
in meiner Anwendung gibt es Personen und Kategorien. Eine Person kann mehreren Kategorien angehören, also eine n:m-Beziehung. Von Person erbt noch eine Klasse Mieter (Lodger). Die Vererbung stelle ich mit Hilfe einer Diskriminatorspalte dar: 'p' für Person, 'l' für Lodger.
Ich brauche alle Personen mit der Kategorie 1.
Nach langem Versuchen habe ich mich entschlossen, eine SQLQuery zu benutzen statt einer Query, weil ich ewig erfolglos damit herumprobiert habe. Schön und gut, ich habe mir eine Select-Anweisung zusammengebastelt, die in MySQL auch funktioniert. Ich bekomme genau das gewünschte Ergebnis, nämlich die Person mit der Id 23. Hibernate jedoch meckert mit folgendem Fehler:
Object with id: 23 was not of the specified subclass: de.waldhausweg7.model.Person (Discriminator: p)
Hier mal die wichtigsten Ausschnitte aus meinen Mapping-Dateien.
Person.hbm.xml
Code:
<?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 default-lazy="false" auto-import="true">
<class name="de.waldhausweg7.model.Person" table="Person">
<id name="personId" type="int">
<generator class="increment" />
</id>
<discriminator column="personType" type="string" force="true" />
<!-- n:m-Beziehung zu Kategorie -->
<set name="categories" table="person_category" lazy="false">
<key column="personId" />
<many-to-many class="de.waldhausweg7.model.Category" column="categoryId" />
</set>
<!-- Beziehung zu der Unterklasse Lodger -->
<subclass name="de.waldhausweg7.model.Lodger" discriminator-value="l">
<property name="extension1" column="extension1" />
<property name="extension2" column="extension2" />
</subclass>
</class>
</hibernate-mapping>
Category.hbm.xml
Code:
<?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 default-lazy="false" auto-import="true">
<class name="de.waldhausweg7.model.Category" table="Category">
<id name="categoryId" type="int">
<generator class="increment" />
</id>
<property name="categoryName" column="categoryName" />
<property name="comment" column="comment" />
</class>
</hibernate-mapping>
Und hier die Methode, in der ich die Select-Anweisung baue:
Code:
public static List<Person> getDormitoryDirection() {
List dormitoryDirection;
Session session = null;
try {
String queryString = "select * from person p, person_category pc where p.personId = pc.personId and pc.categoryId = 1 and p.personType = 'p';";
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
SQLQuery query = session.createSQLQuery(queryString);
query.addEntity(Person.class);
dormitoryDirection = query.list();
session.getTransaction().commit();
return ministers;
}
catch(Exception e) {
System.out.println("PersonenService.getDormitoryDirection(): " + e.getMessage());
return null;
}
finally {
HibernateUtil.closeSession(session);
}
}
Hat jemand eine Idee, woran das liegen könnte?