je un utilisateur de tableMapping deux tables 0..n dans Hibernate
CREATE TABLE "USERS" (
"ID" NUMBER NOT NULL ,
"LOGINNAME" VARCHAR2 (150) NOT NULL)
et j'ai un deuxième SpecialUtilisateurs de table. Aucun UserId ne peut apparaître deux fois dans la table SpecialUsers et seul un petit sous-ensemble des ID des utilisateurs dans la table Users est contenu dans la table SpecialUsers.
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 des utilisateurs dans Hibernate 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 d'Hibernate) dans Internet que je trouve n'ont 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 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 dont j'ai besoin au niveau de l'application est une liste des objets Utilisateur contenus dans la table SpecialUsers.
Pourquoi ne pas simplement ajouter un champ 'spécial' à la table USERS? –
J'ai considéré cela, mais étant donné qu'il y a très peu d'utilisateurs "spéciaux" (actuellement un) et de très nombreux utilisateurs, cela ne semblait pas correct. À long terme, cela rendrait également la table Users peu claire si chaque petite propriété, qui ne s'applique qu'à un petit sous-ensemble d'utilisateurs, serait ajoutée directement à la table Users. Une autre raison est également que si les utilisateurs "spéciaux" ont plus d'attributs liés à leur "particularité" à l'avenir, il est facile d'étendre la table SpecialUsers. – simon
pourquoi pensez-vous qu'il existe une relation 0..n quelque part? Votre modèle physique ne reflète pas cela, il représente une hiérarchie parent-enfant pure (c'est-à-dire l'héritage). Est-ce que je manque quelque chose? –