Spring的Hibernate映射问题
-
22-09-2019 - |
题
我有失败映射的对象适当的弹簧休眠应用:基本上我有2个域对象,一个Post
和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 ...
显然,这是错误的:它应该是从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”。
喔,和一个取=“加入”无法延迟,因为它要求该用户是在同一查询视后取出。
其他提示
这是一个一对一映射的行为。他们通常共享一个主键。休眠是假设后的主键是前述相同的用户的主键。 此页面总结了这一行为。
我怀疑一个用户其实可以有,虽然多个职位。这使得你的映射一个一对多的。