我有以下两个表(与Spring安全性相关 - 但我相信Hibernate的问题):
Table user
Table authority
user
表绑定(通过Hibernate)到我的应用程序中的域对象:class User
,它具有以下属性(以及相应的getter和setter),它们对应于{中的列{1}}表(除了稍后解释的集合):
user
long uId
String username
String password
...
Collection<GrantedAuthority> authorities
表有2列:authority
(外键到UserId
表)和user
(例如“ROLE_USER”)。此表未表示为域对象,而只是Authority
类中的集合。
要创建映射,请在我的User
文件中使用以下内容:
.hbm
在我的hibernate DAO实现中,我创建了一个查询对象,执行查询,并将结果转换为<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>
对象:
User
此时,我希望这个对象可以填充从数据库中提取的数据(我确保使用测试数据正确填充表,并且映射文件中的映射名称是正确的)。 / p>
但是,由于某种原因,在...
Query query = session.createQuery("from User where name = :username");
...
User user = (User) query.uniqueResult();
对象上调用各种属性的getter方法都返回user
。有人可以看到我的设置出现问题吗?也许我映射的集合(对外键关系)错了?谢谢!
更新:这是hibernate生成的sql查询(取自其DEBUG输出):
NULL
出于某种原因,它没有显示与Hibernate: select user0_.UserId as UserId1_, user0_.Name as Name1_,
user0_.Password as Password1_ from user user0_ where user0_.Name=?
表相关的任何内容......这是否意味着我的映射不正确?
编辑:根据bozho的建议,我在启动时看了一下consol上的消息(tomcat),但没有看到任何异常:
authority
答案 0 :(得分:0)
尝试使用"from User where username = :username"
HQL使用类属性,而不是db列名
答案 1 :(得分:0)
Query query = session.craeteQuery("FROM User WHERE username = :username");
query.setString("username", "SomeUserName");
那几乎应该这样做。
答案 2 :(得分:0)
每次运行test / java代码时是否清除数据库?在hibernate中有一个设置,当它打开时,它可以在每次运行test / java代码时清除数据库。
你能做一个findAll()并打印大小吗?我非常怀疑它是错误的数据库,或数据库中没有数据或清除数据。
注意:检查配置文件中的“hibernate.hbm2ddl.auto”属性。如果将其设置为“create-drop”,则hibernate将在启动时自动创建模式,并在VM关闭时删除模式。只需指向“更新”或其他东西
http://docs.atlassian.com/hibernate2/2.1.8/reference/session-configuration.html
答案 3 :(得分:0)
“密码”通常是数据库中的关键字。看起来你正在遇到名称冲突问题。请尝试以下方法。在列名称周围添加刻度标记以进行转义。
<property name="username" column="`Name`" type="java.lang.String" />
<property name="password" column="`Password`" type="java.lang.String" />
假设您正在使用org.springframework.security.GrantedAuthority,那么您对权限的映射是不正确的。根据您的映射方式,当您访问集合时,您很可能会获得ClassCastException。您可能希望使用类似UerType的东西来避免这个问题。