Hibernate Vererbung und mehrere Tabellen mit der gleichen Klasse

Ich bin ziemlich neu zu Überwintern. In meiner situation habe ich eine konkrete Tabelle mit Datensätzen, die join-IDs einer Vielzahl von anderen Tabellen - alle mit der gleichen Struktur.
Was ich möchte, zu erreichen, ist etwas wie

SELECT * 
  FROM main_records mr, ref1 r1, ref2 r2 
 WHERE r1.id = mr.id_ref1 
   AND r2.id = mr.id_ref2;

Die Grundidee wäre die Wiederverwendung der Klasse für die join-Referenzen.

SQL

CREATE TABLE main_records
(
  id integer NOT NULL,
  id_ref1 integer NOT NULL,
  id_ref2 integer NOT NULL
)    
CREATE TABLE ref1
(
  id integer NOT NULL,
  value character varying
)
CREATE TABLE ref2
(
  id integer NOT NULL,
  value character varying
)

Ich habe setup die Basis-POJO-Klassen

JAVA-Klassen

public class MainRecord {
  private Integer id;
  private Ref ref1;
  private Ref ref2;
  ...
  //getters and setters
}

public class Ref {
  private Integer id;
  private String value;
  ...
  //getters and setters
}

Meine Idee ist die Definition der Hibernate-mappings in der folgenden Weise:

Definieren eine abstrakte super-Klasse

<hibernate-mapping package="test">
    <class abstract="true" name="Ref">
        <id name="id" type="java.lang.Integer" column="ID">
            <generator class="native" />
        </id>
        <property name="value" type="java.lang.String" column="VALUE" />
    </class>
</hibernate-mapping>

Anzeigen Hauptsache ist, erweitern Sie die super-Klasse ist aber für die Nutzung einzelner Tabellen

<hibernate-mapping package="test">
    <union-subclass name="Ref1" table="REF1" extends="Ref" />
    <union-subclass name="Ref2" table="REF2" extends="Ref" />

    <class name="MainRecord" table="MAIN_RECORDS">
        <id name="id" column="ID" type="java.lang.Integer" />
        <many-to-one name="ref1" class="Ref1" column="ID_REF1" fetch="join" unique="true" />
        <many-to-one name="ref2" class="Ref2" column="ID_REF2" fetch="join" unique="true" />
     </union-subclass>
  </class>
</hibernate-mapping>

Ich manuell tun mapping-Dateien in die Konfiguration, das laden scheint ok, aber dann tritt ein Fehler auf, ohne detaild Erklärung:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.cxf.transport.servlet.ServletTransportFactory' defined in class path resource [META-INF/cxf/cxf-servlet.xml]: Error setting property values; 
nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (2) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'bus' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring/database.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
PropertyAccessException 2: org.springframework.beans.MethodInvocationException: Property 'transportIds' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring/database.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361)

Das system ist eine Mischung aus Spring 2.5, Hibernate 3.2, Cxf 2.3.4, Javassist 3.11,

Meine Fragen sind:

(a) Ist das der richtige Ansatz?

(b) Der Fehler tritt auf, sobald ich vorstellen

<union-subclass name="Ref1" table="REF1" extends="Ref" />
<union-subclass name="Ref2" table="REF2" extends="Ref" />

so, ich denke, dies ist nicht der beste Weg, es zu tun?

(c) Können geschrieben werden, mit Anmerkungen? Ich kann mir nicht vorstellen, wie definieren die Ref1-und Ref2-Klassen, ohne tatsächlich die Schaffung einer POJO-Klasse für Sie.
(d) Kann ich Nutzer mehr als 1 Ebene der Vererbung? Ich möchte, zum Beispiel, verwenden Sie eine abstrakte Superklasse für alle meine konkreten Tabellen, mit denen die überwachung Feldern, die Sie alle gemeinsam haben?
Lassen Sie uns sagen, Klasse Ref erstreckt sich eine abstrakte AuditTable-Klasse, die in Java und Hibernate mappings.

InformationsquelleAutor Andraz | 2011-07-29

Schreibe einen Kommentar