hibernate映射问题

我有一个spring-hibernate应用程序,它无法正确映射对象:基本上我有2个域对象,一个Post和一个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的表,其中包含一个链接到user表的外部UserId

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

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

显然,这是错误的:它应该是加入UserIdpostUserIduser ,而是它的加入不正确PostIdpost用(其主键) UserIduser

有任何想法吗? 谢谢!

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

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

但是现在我得到一个运行时错误,告诉我没有称为uId属性。 这是有道理的,因为我的post域对象中没有uId列(我只是对user对象有一个引用)。 现在我对我如何让Hibernate意识到它需要将外键从张贴表映射到用户表感到困惑。 应该明确地将uId属性添加到我的post域对象中以作为外键的占位符?

我希望我有道理......


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

编辑 :是的,您可以将帖子上的Post.user属性映射为“多对一”,或者将用户中的User.posts映射为“一对多”或两者。 你是否指定了外键列的名称?

编辑2 :在Hibernate中,数据库中的“列”映射到Java类中的“属性”。 也就是说,column属性包含数据库中外键列的名称,而不是Java类中任何属性的名称。 如果我正确地阅读你的问题,你应该使用“UserId”,而不是“uId”。

哦,并且fetch =“join”不能懒惰,因​​为它强制用户在与帖子相同的查询中获取。


这是一对一映射的行为。 他们通常共享一个主键。 Hibernate假设post的主键与用户的主键相同。 本页面总结了这种行为。

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

链接地址: http://www.djcxy.com/p/63677.html

上一篇: hibernate mapping problem

下一篇: Need help with Hibernate Mapping