帮助Hibernate(Spring)中的外键映射?

时间:2010-02-15 21:40:02

标签: java mysql hibernate orm

我有以下两个表(与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

4 个答案:

答案 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的东西来避免这个问题。