2010-02-17 56 views
0

假设我有对应于PostsUsers的域对象。不过,我有相应的数据库表,其中包含与“帖子”和“用户”有关的信息。Java Spring-Hibernate映射问题?

目前我已经在Hibernate中正确设置了映射,以便我可以从“posts”表中取出信息并将其保存为Post对象。然而,我然后在我的Posts域对象中添加了对User对象的引用(以便每个帖子可以有对应的User对象)。

在我的数据库结构中,“posts”表有一个user_id列,它是“users”表中的外键。

我的问题是:在我的DAO查询“上岗”表时,我必须参加的“用户”表,然后返回的用户数据在某种程度上铸造成User对象?或者我可以简单地离开我的查询(即只是查询“posts”表),并以某种方式添加休眠映射,以便Posts表中的User属性被填充? (我想我想知道如果我正确地设置了映射,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) 

我的映射(不考虑考虑到用户属性)目前看起来像这样:

<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对象也包含用户对象)?

很抱歉,如果当前的职位已经回答了这个......他们只是稍微有一些混乱给我..

回答

0

更新:好了,你有一个令人困惑的答案首先是因为你问了一个令人困惑的问题...回答你的问题再度确实是定义一个多对一映射邮政类(正如其他人已经提到的那样)。现在,如果你想用一个单一的连接查询来获取整个东西,你写的:

<many-to-one name="user" class="User" column="user_id" fetch="join" /> 

原帖:

默认情况下,休眠获取懒洋洋地。实际上,只有在需要提前抓取时,才需要触摸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用户属性。

1

如果我正确理解你的问题,我相信你正在寻找多对一的映射(许多职位对一个用户)。将以下内容添加到Post对象的映射中:

<many-to-one name="user" class="User" column="user_id" lazy="false" /> 
+0

同意以上答案。该映射对于获取用户记录是必需的。 – Padmarag