我有失败映射的对象适当的弹簧休眠应用:基本上我有2个域对象,一个PostUser。语义是每个邮政有1个对应的用户。

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 ...

显然,这是错误的:它应该是从UserId与来自post UserId接合user,而是其从PostId(其主键)与来自post UserId错误地接合user

任何想法?谢谢!

<强>更新: 由于一对夫妇的帖子下面我现在意识到,我应该一直在使用一个多到一的映射,而不是一比一。我改变下post映射到以下内容:

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

但现在我得到一个运行时错误告诉我,有没有叫uId属性。这是有道理的,因为我没有在我的uId域对象post柱(我只是有一个user对象的引用)。现在我真的很困惑,我怎样才能Hibernate来实现,它需要映射的外键的从后表用户表。应该明确一个uId属性添加到我post域对象是一个的占位符的外键?

我希望我做的意义......

有帮助吗?

解决方案

由于用户有很多帖子,你的协会其实是一个“多到一”,而不是“一比一”。如果你因此映射它应该工作。

修改:是的,你可以在用户“多对一”,或者设定User.posts以“一对一对早报财产Post.user地图许多”,或两者兼而有之。你有你指定的外键列的名称?

<强> EDIT2 :在Hibernate讲,“列”在数据库中被映射到在Java级为“属性”。也就是说,列属性包含在数据库中的外键列,在您的Java类中的任何属性的不是名称的名称。如果我看了你的问题的权利,你应该使用“用户ID”,而不是“UID”。

喔,和一个取=“加入”无法延迟,因为它要求该用户是在同一查询视后取出。

其他提示

这是一个一对一映射的行为。他们通常共享一个主键。休眠是假设后的主键是前述相同的用户的主键。 此页面总结了这一行为。

我怀疑一个用户其实可以有,虽然多个职位。这使得你的映射一个一对多的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top