假设我有与Posts
和Users
对应的域对象。不过,我有相应的数据库表,其中包含与“帖子”和“用户”相关的信息。
目前我已经在Hibernate中正确设置了映射,以便我可以从“posts”表中提取信息并将其保存为Post
对象。但是,我在Posts
域对象中添加了对User
对象的引用(以便每个帖子都有一个对应的User
对象)。
在我的数据库结构中,“posts”表有一个user_id
列,它是“users”表中的外键。
我的问题是:在查询DAO中的“posts”表时,是否必须加入“users”表,然后以某种方式将返回的用户数据转换为User
对象?或者我可以简单地保留我的查询(即只查询“posts”表),并以某种方式添加一个hibernate映射,以便填充User
表中的Posts
属性? (我想我想知道如果我正确设置映射,Hibernate是否可以为我自动生成连接 - 示例也会很棒!)
谢谢,我希望我很清楚。
更新:为了澄清,以下是一些代码段:
我的帖子对象:
public class Posts {
private String title;
...
private User user;
//getters and setters here
}
我的帖子表格列:
post_id (primary key)
title
...
user_id (foreign key into User table)
我的映射(不考虑User属性)目前看起来像这样:
<class name="com...Post" table="post">
<id name="pId" column="post_id" />
<property name="title" column="title" type="java.lang.String" />
...
<!-- Need to add mapping here to join with user table?? -->
</class>
所以基本上,我的DAO当前提取没有private User user
属性的Post对象(因为我刚添加了这个)。我的问题是我如何在Post对象中填充该属性(以便获取的Post对象还包含User对象)?
很抱歉,如果当前的帖子已经回答了这个......他们只是让我感到有些困惑..
答案 0 :(得分:1)
如果我理解你的问题,我相信你正在寻找多对一的映射(许多帖子给一个用户)。将以下内容添加到Post对象的映射中:
<many-to-one name="user" class="User" column="user_id" lazy="false" />
答案 1 :(得分:0)
更新:嗯,你首先得到了一个令人困惑的答案,因为你问了一个令人困惑的问题......你更新问题的答案确实是为你的Post类定义了多对一的映射(如其他人已经提到了)。现在,如果您想通过单个连接查询获取整个内容,请编写:
<many-to-one name="user" class="User" column="user_id" fetch="join" />
原帖:
默认情况下,Hibernate会懒惰地取出。实际上,只有在您想要提取时才需要触摸lazy
属性。默认延迟获取计划行为的粗略示例:
Post post = (Post) session.load(Post.class, new Long(123));
// at this point, post refers to a proxy object created by Hibernate
// in the background - no post or user data has been loaded from DB
post.getId();
// post still refers to the proxy object
User user = post.getUser();
// post is now loaded, but user not - it refers to a proxy object
String name = user.getName(); // Now the user data is loaded from DB
因此,如果您对多个查询感到满意,则无需执行任何特殊操作。 OTOH如果要在连接查询中获取所有帖子和用户数据,则需要设置属性fetch="join" in your mapping for the
user`属性。
答案 2 :(得分:-2)
您可以使用默认情况下未激活的lazy属性来执行此操作。 请参阅此处的一些示例http://www.javalobby.org/java/forums/t20533.html