我有一个spring-hibernate应用程序,它无法正确映射对象:基本上我有2个域对象,Post
和User
。语义是每个帖子都有一个相应的用户。Spring-hibernate映射问题
的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
属性。这是有道理的,因为我的post
域对象中没有uId
列(我只是引用了user
对象)。现在我对我如何让Hibernate意识到它需要将帖子表中的外键映射到用户表格感到困惑。应该明确地将uId
属性添加到我的post
域对象中作为占位符的外键?
我希望我做的意义......
谢谢,但将此映射放置在“后”映射中是否正确?我试着用类似的不正确结果。我不知道如何让它在Post表中加入UserId,因为我的域对象没有任何外键的概念,只是对用户对象的引用。 – James 2010-03-25 00:06:49
感谢您的更新,请您详细说明“您是否指定了外键列的名称?”,因为我怀疑这可能是我的问题? – James 2010-03-25 00:19:11
谢谢!!!我浪费了这么多时间...因为你可能猜到我是冬眠的新手...... – James 2010-03-25 00:27:01