Clé Composite avec Hibernate
Afin de générer le code SQL suivant:
create table users (
user_name varchar(15) not null primary key,
user_pass varchar(15) not null);
create table user_roles(
username varchar(15) not null,
role_name varchar(15) not null,
primary key(usernmae, rolename)
);
Vous pouvez utiliser le code tel que:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="databaselayer.users.UserDB" table="users">
<id name="username" type="string" column="user_name">
<meta attribute="scope-set">public</meta>
</id>
<property name="password" type="string" column="user_pass" not-null="true"/>
<set name="roles" cascade="save-update" inverse="true">
<key column="user_name"/>
<one-to-many class="databaselayer.users.RoleDB"/>
</set>
</class>
<class name="databaselayer.users.RoleDB" table="user_roles">
<composite-id>
<key-many-to-one name="username" class="databaselayer.users.UserDB" column="user_name"/>
<key-property name="role" type="string" column="role_name"/>
</composite-id>
</class>
</hibernate-mapping>
Vous pourriez avoir besoin de vos classes ainsi que hbm fichiers de mappage dans votre classpath.
Ensuite, j'ai poster mon Ant schéma cible:
Note ${basedir}/build/WEB-INF/classes contient à la fois *.classe et *.hbm.xml les fichiers.
<target name="schema" description="Generate DB schema from the O/R mapping files">
<hibernatetool destdir="${basedir}">
<classpath path="${basedir}/build/WEB-INF/classes">
<fileset dir="${basedir}/build/WEB-INF/classes">
<include name="**/*"/>
</fileset>
</classpath>
<configuration configurationfile="${basedir}/hibernate.cfg.xml"/>
<hbm2ddl
drop="true"
create="true"
export="true"
outputfilename="libamo2-ddl.sql"
delimiter=";"
format="true"/>
</hibernatetool>
</target>
Liens connexes de mise en veille prolongée de la documentation
ID Composite
Composants composites Id
- Il n'est pas clair quelle est votre question ici.
Vous devez vous connecter pour publier un commentaire.
Regarder dans les hibernate docs pour le "composite-id' élément. Le suivant peut au moins vous donner l'intention -- remplacer votre
id
élément avec:Noter que c'est fortement recommandé au lieu de faire votre ID d'une catégorie distincte ("composant") qui implémente hashCode et equals correctement, et c'est Sérialisable. Sinon, vous avez seulement très maladroit moyens pour la recherche de votre objet à l'aide de
session.get()
ousession.load()
.Peut-être en fait quelque chose comme ceci:
Ce sera la carte les rôles pour une collection dans la classe Utilisateur, et à peu près correspond au schéma que vous avez donné. Il ne permettra pas de créer une clé primaire à travers les colonnes dans
user_roles
bien.Vous aurez généralement obtenir de meilleurs résultats de mise en veille prolongée avec plus normalisée des schémas bien. Par exemple, dans ce cas, vous n'avez pas de table pour les rôles eux-mêmes; mais ce que vous semblez décrire serait assez naturellement être modélisé comme un Utilisateur et le Rôle de la classe, avec un plusieurs-à-plusieurs relation entre eux. Quelque chose comme ceci:
Maintenant, ce sera de produire un schéma avec tables
users
,roles
etuser_roles
et maintenantuser_roles
va avoir une clé primaire à travers le nom d'utilisateur et le rôle de la colonne nom. Vous aussi maintenant avoir un endroit pour accrocher des informations supplémentaires sur les rôles, tels que les descriptions.Aussi, l'erreur que vous publiez est une ClassNotFoundException ce qui ne semble pas être un réel problème avec votre cartographie en tant que tel.
Vous pouvez le faire à l'aide d'un composite ID si vous devez, mais je dirais que c'est une charge de la douleur que vous ne voulez pas entrer dans quelque chose de ce simple.
J'ajoute à la réponse de Chris Hivers, mais à l'aide de clés étrangères pour le mettre en œuvre. Vous pouvez écrire:
Ce sera de faire le travail et aussi prendre soin de clés étrangères, et vous donnera la possibilité de définir vous-même les tables sont créées dans la base de données par Hibernate.
Sergio, regardez cette composite de mappage de touches en mode veille prolongée tutoriel. Peut vous aider.