我有以下兩個表(這與春季安全追平 - 但我相信這個問題是使用Hibernate):幫助Hibernate(Spring)中的外鍵映射?
Table user
Table authority
的user
表被捆綁(通過Hibernate)的域對象在我的應用程序:class User
,其具有以下屬性(和相應的getter和setter),其對應於在user
表中的列(除了後述的集合):
long uId
String username
String password
...
Collection<GrantedAuthority> authorities
的authority
表有兩列:UserId
(user
表中的外鍵)和Authority
(例如, 「ROLE_USER」)。此表不被表示爲域對象,但僅是User
類中的一個集合。
要創建的映射,在我.hbm
文件我用如下:
<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>
在我休眠DAO實現中,我創建一個查詢對象,執行查詢,並把結果向User
對象:
...
Query query = session.createQuery("from User where name = :username");
...
User user = (User) query.uniqueResult();
在這一點上,我希望這個對象來與它從DB拉(我確信,該表與試驗數據正確填充和映射的名字是在映射正確的數據填充文件)。
但是,由於某種原因,在user
對象上調用各種屬性的getter方法都會返回NULL
。有人可以看到我的設置立即出錯嗎?也許我映射集合(到外鍵關係)是錯誤的?謝謝!
更新:這裏是SQL查詢Hibernate生成(從它的調試輸出取):
Hibernate: select user0_.UserId as UserId1_, user0_.Name as Name1_,
user0_.Password as Password1_ from user user0_ where user0_.Name=?
出於某種原因,它不會顯示相關authority
表什麼...不這意味着我的映射不正確?
編輯:每bozho的建議下,我看了一眼在啓動時對CONSOL消息(Tomcat)的,但沒有看到任何不尋常的:
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
您使用的是什麼版本的Spring Hibernate。 。 。好奇 – 2010-02-15 21:58:55
Spring 3.0和hibernate 3.2.7 – oym 2010-02-15 22:02:37
映射對我來說看起來還不錯,而且這種關聯似乎也沒問題,但這就像在黑暗中摸索。你能否提供完整的映射,以及如何將你的映射添加到sessionfactory,比如spring config?你能夠保存對象嗎?你看到他們在你的SQL瀏覽器?如果這只是用戶實體的一個問題,我建議在單元測試中嘗試重現它,並在春天的東西。 – zoidbeck 2010-02-15 22:13:01