Question

J'ai Utilisateurs de table


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

et j'ai un deuxième SpecialUtilisateurs de table. Non UserId peut se produire deux fois dans la table SpecialUtilisateurs, et seulement un petit sous-ensemble des ids des utilisateurs dans la table des utilisateurs sont contenus dans le tableau SpecialUtilisateurs.


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") 
/

Cartographie de la table Utilisateurs en veille prolongée fonctionne ok


<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>

Mais je me bats pour créer le mappage de la table SpecialUtilisateurs. Tous les exemples (par exemple dans la documentation Hibernate) dans Internet, je ne trouve pas ce type d'auto-référence. J'ai essayé une application comme ceci:


<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>

mais a obtenu l'erreur


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

Comment dois-je la carte la table SpecialUtilisateurs? Ce que je dois au niveau de l'application est une liste des objets utilisateur contenus dans la table SpecialUtilisateurs.

Était-ce utile?

La solution

  

Comment dois-je la carte la table SpecialUtilisateurs?

Selon la structure de vos tables de USERS et SPECIALUSERS, vous avez un Tableau par la sous-classe hiérarchie et il est parfaitement possible de cartographier ce genre de hiérarchie avec Hibernate .

Tout d'abord, assurez-vous que SpecialUser inherits de User au niveau du modèle d'objet (ce qui est une relation d'héritage, pas une auto-référence).

public class SpecialUser extends User { 
}

Ensuite, déclarer un élément <joined-subclass> dans la cartographie du User:

<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>
  

Ce que je dois le niveau d'application est une liste des objets utilisateur contenus dans la table SpecialUtilisateurs.

La requête HQL suivante retournera tous les SpecialUser (qui sont User aussi):

from SpecialUser

Si plus tard, vous devez ajouter des colonnes à la table de SPECIALUSERS, ajoutez les attributs correspondant à la classe SpecialUser et les cartographier dans l'élément <joined-subclass>. Reportez-vous au lien fourni (à la documentation) pour les détails.

Autres conseils

Si vous avez vraiment utiliser une deuxième table, vous devez mapper à une nouvelle classe. Mise en veille prolongée peut toujours que la carte d'une table à une classe.

Vous pouvez également ajouter une colonne à la table d'utilisateur qui dit « cet utilisateur est spécial ». Si ce n'est pas une option, créer une vue qui joint les deux tables et simule ainsi cette colonne. Ensuite, vous pouvez sélectionner les utilisateurs par cette colonne.

Si vous allez la façon dont deux classes, vous devez charger une liste des utilisateurs spéciaux et faire la mise en correspondance dans votre application.

[EDIT] Peut-être que vous devriez regarder dans les relations parents-enfants. Dans votre cas, l'utilisateur est le parent et ses rôles sont les enfants. Ainsi, chaque utilisateur a 0..n rôles qui sont mis en correspondance dans une autre table. Vous pouvez ensuite utiliser HQL

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

pour trouver tous les utilisateurs avec un certain rôle. Mais la plupart du temps, vous aurez un utilisateur spécifique et juste besoin de se demander si elle a un certain rôle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top