Вопрос о Java Spring-Hibernate? - PullRequest
       14

Вопрос о Java Spring-Hibernate?

0 голосов
/ 17 февраля 2010

Скажем, у меня есть доменные объекты, соответствующие Posts и Users. Тем не менее, у меня есть соответствующие таблицы базы данных, содержащие информацию, относящуюся к «сообщениям» и «пользователям».

В настоящее время я правильно настроил отображение в Hibernate, чтобы я мог извлекать информацию из таблицы «posts» и сохранять ее как объект Post. Однако затем я добавил к своему объекту Posts домен ссылку на объект User (чтобы каждый пост мог иметь соответствующий объект User).

В моей структуре базы данных таблица "posts" имеет столбец user_id, который является внешним ключом в таблице "users".

Мой вопрос: при запросе к таблице «posts» в моем DAO нужно ли мне присоединяться к таблице «users», а затем каким-то образом преобразовывать возвращаемые пользовательские данные в объект User? Или я могу просто оставить свой запрос как есть (т. Е. Просто запросить таблицу «posts») и каким-то образом добавить отображение гибернации, чтобы заполнить атрибут User в таблице Posts? (Думаю, мне интересно, сможет ли Hibernate автоматически сгенерировать соединение для меня, если я правильно настрою отображение - примеры тоже подойдут!)

Спасибо, и я надеюсь, что я достаточно ясно.

Обновление : Просто для пояснения, вот несколько фрагментов кода:

Мой пост Объект:

public class Posts {

  private String title;
  ...
  private User user;

  //getters and setters here
}

Столбцы таблицы My Post:

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 в настоящее время выбирает объект Post без атрибута private User user (так как я только что добавил это). У меня был вопрос, как мне заполнить этот атрибут в объекте Post (, чтобы в выбранном объекте Post также содержался объект User )?

Извините, если текущие сообщения уже ответили на это ... они просто немного сбивают меня с толку ..

Ответы [ 3 ]

1 голос
/ 18 февраля 2010

Если я правильно понимаю ваш вопрос, я считаю, что вы ищете сопоставление «многие к одному» (много сообщений одному пользователю). Добавьте следующее в ваше сопоставление для объекта Post:

<many-to-one name="user" class="User" column="user_id" lazy="false" />
0 голосов
/ 17 февраля 2010

Обновление: Что ж, сначала вы получили непонятный ответ, потому что задали непонятный вопрос ... Ответ на ваш обновленный вопрос действительно состоит в том, чтобы определить сопоставление «многие к одному» для вашего класса 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` property.

0 голосов
/ 17 февраля 2010

Вы можете сделать это, используя свойство lazy, которое по умолчанию не активировано. Смотрите некоторые примеры здесь http://www.javalobby.org/java/forums/t20533.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...