【问题标题】:Java Spring-Hibernate mapping question?Java Spring-Hibernate 映射问题?
【发布时间】:2011-01-18 00:42:09
【问题描述】:

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

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

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

我的问题是:在我的 DAO 中查询“posts”表时,我是否必须加入“users”表,然后以某种方式将返回的用户数据转换为 User 对象?或者我可以简单地保留我的查询(即只查询“posts”表),并以某种方式添加一个休眠映射,以便填充Posts 表中的User 属性? (我想我想知道如果我正确设置映射,Hibernate 是否可以自动为我生成连接 - 示例也很棒!)

谢谢,我希望我已经足够清楚了。

更新:澄清一下,这里有一些代码 sn-ps:

我的帖子对象:

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 对象)?

对不起,如果当前的帖子已经回答了这个问题......他们只是让我有点困惑......

【问题讨论】:

    标签: java hibernate spring join


    【解决方案1】:

    您可以通过使用默认未激活的惰性属性来做到这一点。 在此处查看一些示例http://www.javalobby.org/java/forums/t20533.html

    【讨论】:

    • 延迟获取是默认行为 - 即使在您链接的文章中也有说明。
    【解决方案2】:

    更新:好吧,您首先得到了一个令人困惑的答案,因为您提出了一个令人困惑的问题......您重新提出的问题的答案确实是为您的 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 theuser` 属性。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 同意以上回答。映射是获取用户记录所必需的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 2021-06-28
      • 2011-07-31
      • 2021-10-24
      相关资源
      最近更新 更多