我有一个 spring-hibernate 应用程序无法正确映射对象:基本上我有 2 个域对象, aPost
和 a User
。语义是每个帖子都有 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 ...
显然这是错误的:它应该从 from 加入from ,UserId
但它错误地从(它的主键)加入from 。post
UserId
user
PostId
post
UserId
user
有任何想法吗?谢谢!
更新:感谢下面的几篇文章,我现在意识到我应该使用多对一映射而不是一对一映射。我将映射更改post
为以下内容:
<many-to-one name="User" class="com...User" column="uId"/>
但是现在我收到一个运行时错误,告诉我没有名为uId
. 这是有道理的,因为我的域对象中没有uId
列post
(我只是引用了一个user
对象)。现在我真的很困惑如何让 Hibernate 意识到它需要将外键从 post 表映射到 user 表。uId
是否应该向我的post
域对象显式添加一个属性作为外键的占位符?
我希望我是有道理的...