【发布时间】:2011-01-17 04:02:00
【问题描述】:
我有以下两个表(与 Spring 安全性相关 - 但我认为问题在于 Hibernate):
Table user
Table authority
user 表绑定(通过 Hibernate)到我的应用程序中的域对象:class User,它具有以下属性(以及相应的 getter 和 setter),它们对应于 user 表中的列(除了后面会解释的集合):
long uId
String username
String password
...
Collection<GrantedAuthority> authorities
authority 表有 2 列: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();
此时,我希望这个对象会填充它从数据库中提取的数据(我确保表中正确填充了测试数据,并且映射文件中的映射名称正确)。
但是,出于某种原因,为 user 对象上的各种属性调用 getter 方法都会返回 NULL。有人可以立即看到我的设置有问题吗?也许我将集合(到外键关系)映射错了?谢谢!
更新:这是 hibernate 生成的 sql 查询(取自其 DEBUG 输出):
Hibernate: select user0_.UserId as UserId1_, user0_.Name as Name1_,
user0_.Password as Password1_ from user user0_ where user0_.Name=?
由于某种原因,它没有显示与authority 表相关的任何内容...这是否意味着我的映射不正确?
编辑:根据 bozho 的建议,我查看了启动时控制台 (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。 . .好奇
-
Spring 3.0 和休眠 3.2.7
-
映射对我来说看起来不错,关联似乎也不错,但这就像在黑暗中摸索。您能否提供完整的映射以及如何将映射添加到 sessionfactory,例如 spring config?你能保存对象吗?你在你的 sql 浏览器中看到它们了吗?如果这只是用户实体的问题,我建议尝试在单元测试中重现它,并使用 spring 的东西。
-
是的,这只是用户实体的问题(我有其他映射到正确检索的其他域对象)。我将尝试对此进行更多研究。谢谢。
-
我认为控制台中应该有更多关于它的信息。也许在启动期间,当映射实现时