Frage

Ich habe eine Tabelle Benutzer


CREATE TABLE "USERS" (
    "ID" NUMBER NOT NULL ,
    "LOGINNAME" VARCHAR2 (150) NOT NULL )

Und ich habe einen zweiten Tischspezialuser. In der Tabelle SpecialUsers kann kein Benutzer -ID zweimal auftreten, und nur eine kleine Teilmenge der IDs der Benutzer in der Benutzertabelle sind in der SpecialUsers -Tabelle enthalten.


CREATE TABLE "SPECIALUSERS" (
    "USERID" NUMBER NOT NULL,
 CONSTRAINT "PK_SPECIALUSERS" PRIMARY KEY ("USERID") )

ALTER TABLE "SPECIALUSERS" ADD CONSTRAINT "FK_SPECIALUSERS_USERID" FOREIGN KEY ("USERID") 
REFERENCES "USERS" ("ID") 
/

Die Zuordnung der Benutzertabelle in Hibernate funktioniert in Ordnung


<hibernate-mapping package="com.initech.domain">
    <class name="com.initech.User" table="USERS">

        <id name="id" column="ID" type="java.lang.Long">
            <meta attribute="use-in-tostring">true</meta>
            <generator class="sequence">
                <param name="sequence">SEQ_USERS_ID</param>
            </generator>
        </id>

        <property name="loginName" column="LOGINNAME" type="java.lang.String" not-null="true">
            <meta attribute="use-in-tostring">true</meta>
        </property>

    </class>
</hibernate-mapping>

Aber ich kämpfe darum, die Kartierung für die SpecialUsers -Tabelle zu erstellen. Alle Beispiele (z. B. in Hibernate-Dokumentation) im Internet, das ich gefunden habe, haben diese Art von Selbstreferenz nicht. Ich habe eine Kartierung wie diese ausprobiert:


<hibernate-mapping package="com.initech.domain">
    <class name="com.initech.User" table="SPECIALUSERS">        

        <id name="id" column="USERID">
            <meta attribute="use-in-tostring">true</meta>
            <generator class="foreign">
                <param name="property">user</param>
            </generator>
        </id>

        <one-to-one name="user" class="User"/>

    </class>
</hibernate-mapping>

habe aber den Fehler bekommen


Invocation of init method failed; nested exception is org.hibernate.DuplicateMappingException: 
Duplicate class/entity mapping com.initech.User 

Wie soll ich die SpecialUsers -Tabelle zuordnen? Was ich auf der Anwendungsebene benötige, ist eine Liste der in der SpecialUser -Tabelle enthaltenen Benutzerobjekte.

War es hilfreich?

Lösung

Wie soll ich die SpecialUsers -Tabelle zuordnen?

Gemäß der Struktur Ihrer USERS und SPECIALUSERS Tische haben Sie eine Tabelle pro Unterklasse Hierarchie und Es ist durchaus möglich, diese Art von Hierarchie mit Hibernate abzubilden.

Stellen Sie zunächst sicher, dass das SpecialUser Erben aus User Auf der Ebene der Objektmodell (dies ist eine Vererbungsbeziehung, keine Selbstreferenz).

public class SpecialUser extends User { 
}

Dann deklarieren Sie a <joined-subclass> Element in der User's Mapping:

<hibernate-mapping package="com.initech.domain">
    <class name="com.initech.User" table="USERS">

        <id name="id" column="ID" type="java.lang.Long">
            <meta attribute="use-in-tostring">true</meta>
            <generator class="sequence">
                <param name="sequence">SEQ_USERS_ID</param>
            </generator>
        </id>

        <property name="loginName" column="LOGINNAME" type="java.lang.String" not-null="true">
            <meta attribute="use-in-tostring">true</meta>
        </property>

        <joined-subclass name="com.initech.SpecialUser" table="SPECIALUSERS">
            <key column="USERID"/>
        </joined-subclass>

    </class>
</hibernate-mapping>

Was ich auf der Anwendungsebene benötige, ist eine Liste der in der SpecialUser -Tabelle enthaltenen Benutzerobjekte.

Die folgende HQL -Abfrage würde alle zurückgeben SpecialUser (welche sind User zu):

from SpecialUser

Wenn später Sie die Spalten zum Hinzufügen von Spalten hinzufügen müssen SPECIALUSERS Tabelle fügen Sie die entsprechenden Attribute zu der hinzu SpecialUser Klasse und kartieren Sie sie innerhalb der <joined-subclass> Element. Die angegebenen Link (zur Dokumentation) finden Sie die Details.

Andere Tipps

Wenn Sie wirklich eine zweite Tabelle verwenden müssen, müssen Sie sie einer neuen Klasse zuordnen. Hibernate kann immer nur eine Tabelle auf eine Klasse abbilden.

Fügen Sie alternativ eine Spalte zur Benutzertabelle hinzu, in der "dieser Benutzer speziell ist". Wenn dies keine Option ist, erstellen Sie eine Ansicht, die die beiden Tabellen verbindet, und simuliert so diese Spalte. Anschließend können Sie Benutzer nach dieser Spalte auswählen.

Wenn Sie die beiden Klassenstraßen begeben, müssen Sie eine Liste der speziellen Benutzer laden und die Zuordnung in Ihrer Anwendung durchführen.

Bearbeiten] Vielleicht sollten Sie sich mit Eltern-Kind-Beziehungen befassen. In Ihrem Fall ist der Benutzer der Elternteil und seine Rollen sind die Kinder. So hat jeder Benutzer 0 ... keine Rollen, die in einer anderen Tabelle zugeordnet sind. Sie können dann diese HQL verwenden

from User u where :role in elements(u.roles)

um alle Benutzer mit einer bestimmten Rolle zu finden. Meistens haben Sie jedoch einen bestimmten Benutzer und müssen nur fragen, ob sie eine bestimmte Rolle spielt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top