Java Spring-Hibernate映射问题?

时间:2010-02-17 19:21:05

标签: java hibernate spring join

假设我有与PostsUsers对应的域对象。不过,我有相应的数据库表,其中包含与“帖子”和“用户”相关的信息。

目前我已经在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对象)?

很抱歉,如果当前的帖子已经回答了这个......他们只是让我感到有些困惑..

3 个答案:

答案 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