【问题标题】:Spring-hibernate mapping problemSpring-休眠映射问题
【发布时间】:2011-01-31 12:33:09
【问题描述】:

我有一个 spring-hibernate 应用程序无法正确映射对象:基本上我有 2 个域对象,一个 Post 和一个 User。语义是每个 Post 都有 1 个对应的 User。

Post 域对象大致如下:

class Post {

  private int pId;
  private String attribute;
  ...
  private User user;

  //getters and setters here

}

如您所见,Post 包含对User 的引用。当我加载一个Post 对象时,我想加载对应的User 对象(懒惰-仅在需要时)。

我的映射如下所示:

<class name="com...Post" table="post">
    <id name="pId" column="PostId" />
    <property name="attribute" column="Attribute" type="java.lang.String" />

    <one-to-one name="User" fetch="join"
        class="com...User"></one-to-one>
</class>

当然,我已经设置了User 的基本映射。

就我的表架构而言,我有一个名为post 的表,其中有一个外部UserId 链接到user 表。

我认为这个设置应该可以工作,但是当我加载一个强制延迟加载 User 对象的页面时,我注意到正在生成以下 Hiberate 查询:

Select ... from post this_ left outer join user user2_ on this.PostId=user2_.UserId ...

显然这是错误的:它应该将来自postUserId 与来自userUserId 连接起来,但它错误地将来自postPostId 与来自UserIdUserId 连接起来user.

有什么想法吗?谢谢!

更新: 感谢下面的几篇文章,我现在意识到我应该使用多对一映射而不是一对一映射。我将post下的映射改成如下:

<many-to-one name="User" class="com...User" column="uId"/>

但现在我收到一个运行时错误,告诉我没有名为uId 的属性。这是有道理的,因为我的post 域对象中没有uId 列(我只是引用了user 对象)。现在我真的很困惑如何让 Hibernate 意识到它需要将 外键 从 post 表映射到 user 表。是否应该将uId 属性显式添加到我的post 域对象作为外键的占位符

我希望我是有道理的......

【问题讨论】:

    标签: java hibernate spring hibernate-mapping


    【解决方案1】:

    由于用户有很多帖子,您的关联实际上是“多对一”,而不是“一对一”。如果您相应地映射它,它应该可以工作。

    编辑:是的,您可以将 Post 上的属性 Post.user 映射为“多对一”,或者将 User 中的设置 User.posts 映射为“一对一”许多”,或两者兼而有之。您是否指定了外键列的名称?

    Edit2:在 Hibernate 中,数据库中的“列”映射到 Java 类中的“属性”。也就是说,column 属性包含数据库中外键列的名称,而不是 Java 类中任何属性的名称。如果我没看错你的问题,你应该使用“UserId”,而不是“uId”。

    哦,而且 fetch="join" 不能偷懒,因为它要求在与帖子相同的查询中获取用户。

    【讨论】:

    • 谢谢,但是将此映射放在“post”映射中是否正确?我尝试了类似的错误结果。我不确定如何让它加入 Post 表中的 UserId,因为我的域对象没有任何外键概念,只是对 User 对象的引用。
    • 感谢您的更新,您能否详细说明“您是否指定了外键列的名称?”,因为我怀疑这可能是我的问题?
    • 谢谢!!!我在这上面浪费了很多时间......你可能猜到我是新来的休眠......
    【解决方案2】:

    这是一对一映射的行为。它们通常共享一个主键。 Hibernate 假设 post 的主键与 user 的主键相同。 This page 总结了这种行为。

    我怀疑一个用户实际上可以拥有多个帖子。这使您的映射成为一对多。

    【讨论】:

    • 您是正确的,用户拥有超过 1 个帖子。我只是对放置此映射的位置感到困惑:在 Post 的映射下还是在 User 的映射下?
    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2014-05-12
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2021-01-19
    相关资源
    最近更新 更多