【发布时间】: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 ...
显然这是错误的:它应该将来自post 的UserId 与来自user 的UserId 连接起来,但它错误地将来自post 的PostId 与来自UserId 的UserId 连接起来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