【问题标题】:Help with foreign key mapping in Hibernate (Spring)?帮助 Hibernate(Spring)中的外键映射?
【发布时间】: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 列:UserIduser 表的外键)和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 的东西。
  • 是的,这只是用户实体的问题(我有其他映射到正确检索的其他域对象)。我将尝试对此进行更多研究。谢谢。
  • 我认为控制台中应该有更多关于它的信息。也许在启动期间,当映射实现时

标签: java mysql hibernate orm


【解决方案1】:
Query query = session.craeteQuery("FROM User WHERE username = :username");
query.setString("username", "SomeUserName");

应该差不多了。

【讨论】:

  • 我有这个,我只是没有显示这条线。唯一的区别是我使用了以下内容: query.setString("username", username);其中用户名是方法的参数。我尝试 setParamter() 只是为了好玩和同样的问题。
  • System.out.println参数的值看看是什么
  • 是的,我在该函数中有调试调用,可以正确打印出值及其设置(即该值存在于数据库中)。谢谢你的建议。
  • 您是否尝试使用参数的实际值(而不是?)手动执行生成的sql查询?以及结果如何。
  • 刚刚尝试过,它从数据库返回一行(完全填充)
【解决方案2】:

试试"from User where username = :username"

HQL 使用类属性,而不是 db 列名

【讨论】:

  • 同样的效果:一切都是NULL。我觉得这很奇怪 - 如果我错误地使用列名代替类属性,我之前不会遇到其他错误吗?
  • 当我将名称更改为既不是类属性也不是数据库列名的名称时,我会收到错误消息。也许hibernate足够聪明,可以检查类属性和它映射到的db列?无论哪种方式,我原来的问题仍然存在..
  • 你可以配置hibernate来记录它的sql查询吗?有没有真正的sql查询?
【解决方案3】:

您每次运行 test/java 代码时都在清除数据库吗?在hibernate中有一个设置,打开后,每次运行test/java代码都会清空数据库。

你能做一个 findAll() 并打印尺寸吗?我非常怀疑是db错了,或者db中没有数据或者清除了数据。

注意:检查配置文件中的“hibernate.hbm2ddl.auto”属性。如果设置为“create-drop”,休眠将在启动时自动创建架构,并在 VM 关闭时删除架构。只需将其指向“更新”或其他内容

http://docs.atlassian.com/hibernate2/2.1.8/reference/session-configuration.html

【讨论】:

  • 感谢您的建议,我会调查并通知您。但我对此持怀疑态度,因为我总是打开一个数据库管理程序来向我显示数据,而数据并没有被清除或其他任何东西。
  • 也只是做一个 findAll,遍历每个用户并打印所有内容。你会知道你是否错过了什么。也许“用户名”中有一个你没有给出的空格,最后有一个空格......某事:)
  • 仍然一切都是 NULL。正如我之前在评论中提到的,我尝试使用 Hibernate 生成的查询字符串(我从其调试输出中提取)直接查询数据库,并且它正确地返回了行...
  • 正确,所以 findAll 打印一个数字 > 0。您选择查询“选择 user0_.UserId 作为 UserId1_, user0_.Name 作为 Name1_, user0_.Password as Password1_ from user user0_ where user0_.Name=? "并针对 HQL DB 运行它,它会显示一个填充值的行。但是当您打印用户名和密码时,它显示为空。尝试将列重命名为 x 和 y 并查看会发生什么(记住用户名和密码等列有问题)。还要确保你有 getter/setter(虽然很明显)
【解决方案4】:

“密码”通常是数据库中的关键字。您似乎遇到了名称冲突问题。试试下面的。在列名周围打勾以进行转义。

<property name="username" column="`Name`" type="java.lang.String" />
<property name="password" column="`Password`" type="java.lang.String" />

假设您使用的是 org.springframework.security.GrantedAuthority,那么您的权限映射不正确。根据您映射的方式,当您访问该集合时,您很可能会收到 ClassCastException。您可能想使用类似 UerType 的东西来避免这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2018-03-05
    • 1970-01-01
    相关资源
    最近更新 更多