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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich verstehe die Frage richtig, Sie haben einen master-Datensatz-Tabelle mehrere foreign-key zu viel-Tabelle mit den gleichen Spalten untereinander ?
Nein, Sie versuchen zu tun, Vererbung, indem die Tabelle pro Klasse Strategie Hexe, die ich denke, ist nicht geeignet, verwenden Sie hier, weil Sie einen Verweis auf die jeweils für jeden Typ ein Objekt(Feld Ref1 und Feld Ref2 in Ihrem Fall).
Der Anwendungsfall, können geeignet sein, um die Vererbung verwenden, wenn Sie eine polymorphe Assoziation zum Ref in die MasterRecord Objekt
Beispiel polymorphe Assoziation Ref
Den Verein
anyObjectRef1OrRef2
gewesen wäre-Karte mit der<any ... />
element in der Zuordnung von MasterRecord. Hätte es brauchte zwei, Spalte eins mit der Klassenname und eine für die foreignKeyWas Sie tun sollten ist, die Eigenschaften Erben von einer Oberklasse (keine spezifische Tabelle für die Superklasse)
Ja mit @MappedSuperclass annotation.
Hibernate-Referenz-Implementierung (Mit Annotation)
Es nicht getan werden kann ohne die Schaffung von Ref1 und Ref2 pojo-Klassen.
Beispiel mit annotation
Basisklasse Ref.java
Klasse Ref1.java
Klasse Ref2.java
Klasse MainRecord.java
Erstellen und speichern Entität wie folgt
verwenden hibernate maping-Datei, die Sie entfernen müssen alle Annotationen verwenden Sie die unten stehende Abbildung.
Nicht, dass bei der Verwendung einer mapping-Datei, die abstrakte
Ref.java
super-Klasse nicht zugeordnet ist und alle Eigenschaften der super-Klasse ist in jedem Kind mapping-Datei.InformationsquelleAutor Joel Hudon
Nur eine Frage.... wenn Sie der gleichen Klasse Zugriff auf mehrere verschiedene Tabellen...
Um die Tabelle gespeichert werden neue Instanzen, die Sie sparen? Wie Hibernate wissen?
AFAIK, dies kann nicht getan werden.
InformationsquelleAutor SJuan76
Abkürzungen wie diese, auch wenn Sie gemacht werden können zu der Arbeit, die oft dazu führen, auf einer Straße, die eventuelle Verwirrung für Entwickler, die Erben Ihren code. Bevor du fragst "kann es sein", fragt "sollte es gemacht werden".
Denke, die Straße hinunter: ist es besser, mehr "effizient" bei der Entwicklung Zeit, indem Sie die Anzahl der Klassen reduzieren und mit einem etwas obskuren Funktion, oder ist es besser, einfach zu machen, die eigenen Klassen und die Dinge leichter verständlich. Auch könnte man Feld sich in eine Ecke, weil diese spezielle Funktion verursachen könnten unbeabsichtigte Folgen, die klassischen "warum ist es zu tun , dass" - situation.
Habe ich erbte viele apps, bei denen frühere Generationen von Entwickler wollten, Dinge zu tun, die in "cool" oder "elegante" Möglichkeiten und endete verursacht mehr Verwirrung als wenn Sie aufbewahrt hatte, die Dinge konkret und einfach.
Nur erzeugen die einzelnen Klassen.
InformationsquelleAutor atrain