je les deux tableau ci-dessous (qui sont liés à la sécurité de printemps - mais la question que je crois avec Hibernate):Aide avec le mappage de clé étrangère dans Hibernate (Spring)?
Table user
Table authority
Le tableau user
est lié (par Hibernate) à un objet de domaine dans mon application : class User
, qui a les attributs suivants (et accesseurs correspondants), qui correspondent aux colonnes de la table user
(sauf pour la collection qui est expliqué plus loin):
long uId
String username
String password
...
Collection<GrantedAuthority> authorities
le tableau authority
a 2 colonnes: UserId
(clé étrangère dans le tableau user
) et Authority
(par ex. "ROLE_USER"). Cette table n'est pas représentée en tant qu'objet de domaine, mais est simplement une collection de la classe User
.
Pour créer le mappage, dans mon fichier .hbm
j'utilise les éléments suivants:
<class name="com.business.project.domain.User" table="user">
<id name="uId" column="UserId"></id>
<property name="username" column="Name" type="java.lang.String" />
<property name="password" column="Password" type="java.lang.String" />
...
<set name="authorities" table="authority">
<key column="UserId" />
<element column="Authority" type="java.lang.String" />
</set>
</class>
Dans ma mise en veille prolongée la mise en œuvre de DAO, je crée un objet de requête, exécutez la requête, et jeter le résultat à un objet User
:
...
Query query = session.createQuery("from User where name = :username");
...
User user = (User) query.uniqueResult();
à ce stade, je me attends à cet objet pour être rempli avec les données qu'il a tiré de la DB (je me suis assuré que les tables sont correctement avec des données de test et les noms de mappage sont corrects dans la cartographie fichier). Toutefois, l'appel des méthodes getter pour divers attributs de l'objet user
renvoie tous NULL
pour une raison quelconque. Quelqu'un peut-il voir quelque chose qui ne va pas dans ma configuration? Peut-être que j'ai mappé la collection (à la relation clé étrangère) mal? MERCI!
Mise à jour: voici la requête SQL qui hibernent généré (tiré de sa sortie DEBUG):
Hibernate: select user0_.UserId as UserId1_, user0_.Name as Name1_,
user0_.Password as Password1_ from user user0_ where user0_.Name=?
Pour une raison quelconque, il ne montre pas tout ce qui touche à la table authority
... ne cela signifie que ma cartographie est incorrecte?
Modifier: Par la suggestion de bozho, j'ai regardé les messages sur le Consol au démarrage (tomcat), mais ne vois rien hors de l'ordinaire:
Feb 16, 2010 10:35:12 AM org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: com.me.project.domain.User -> user
Feb 16, 2010 10:35:12 AM org.hibernate.cfg.HbmBinder bindCollection
INFO: Mapping collection: com.me.project.domain.User.authorities -> authority
Quelles versions de Spring Hibernate utilisez-vous? . . curieux –
Spring 3.0 et hibernate 3.2.7 – oym
La cartographie me semble ok et l'association semble ok aussi mais c'est comme tâtonner dans l'obscurité. Pouvez-vous fournir le mappage complet et comment vous ajoutez votre mapping à sessionfactory comme Spring Config par exemple s'il vous plait? Êtes-vous capable de sauvegarder des objets? Les voyez-vous dans votre navigateur sql? Si c'est juste un problème avec l'entité utilisateur, je suggère de le reproduire dans un test unitaire w et wo les trucs de printemps. – zoidbeck