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 ...
显然,这是错误的:它应该是加入UserId
从post
与UserId
的user
,而是它的加入不正确PostId
从post
用(其主键) UserId
的user
。
有任何想法吗? 谢谢!
更新 :感谢下面的几篇文章,我现在认识到我应该使用多对一的映射而不是一对一的。 我将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