我有以下两个表(这与春季安全追平 - 但我相信这个问题是使用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