Есть ли в Hibernate разница между session.get () и session.load (), кроме того, как обрабатываются плохие идентификаторы? - PullRequest
1 голос
/ 23 декабря 2009

Приложение, над которым я работаю, выполняет все свои запросы по идентификатору с помощью session.load (). Учитывая тот хаос, который он вызывает, когда не может найти идентификатор и выдает исключение, я подумываю поменять его на session.get (). Но прежде чем я это сделаю, это настолько фундаментальная часть системы, что я хочу убедиться, что между этими двумя методами нет абсолютно никакой разницы. Есть ли какая-то причина, по которой вы можете подумать о том, почему первоначальные разработчики выбрали бы load () вместо get () помимо при обработке недопустимых идентификаторов?

РЕДАКТИРОВАТЬ: Как уже было сказано выше, я полностью осознаю, что get возвращает false и загрузка генерирует исключение. Я спрашиваю, есть ли ДРУГОЙ способ, которым они отличаются.

Ответы [ 4 ]

2 голосов
/ 23 декабря 2009

Не правда ли, что Get никогда не возвращает прокси, а Load - нет?

http://ayende.com/Blog/archive/2009/04/30/nhibernate-ndash-the-difference-between-get-load-and-querying-by.aspx

Я думаю, что это важно:

Почему это полезно? Ну если знаешь что значение существует в базе данных, и вы не хотите платить дополнительно выберите, чтобы иметь это, но вы хотите получить это значение, чтобы мы могли добавить, что ссылку на объект, вы можете использовать Загрузите для этого: Код выше не приведет к выбрать в базу данных, но когда мы совершить сделку, мы установим столбец CustomerID до 1. Это как NHibernate поддерживает ОО фасад давая вам такую ​​же оптимизацию Преимущества работы напрямую с API низкого уровня.

Из справочной документации NH 2.0:

Обратите внимание, что Load () выдаст неисправимое исключение, если нет соответствующая строка базы данных. Если класс Load (), сопоставленный с прокси, возвращает объект, который является неинициализированным прокси и на самом деле не попадает в базу данных пока вы не вызовете метод объект. Такое поведение очень полезно если вы хотите создать ассоциацию к объекту без фактической загрузки это из базы данных.

Если вы не уверены, что соответствующий строка существует, вы должны использовать Get () метод, который попадает в базу данных немедленно и возвращает ноль, если есть нет подходящей строки.

0 голосов
/ 23 декабря 2009

Проверьте этот пост, ответ, который был выбран в качестве правильного ответа, объясняет все.

Hibernate: разница между session.get и session.load

0 голосов
/ 23 декабря 2009

Хороший подход показан следующим образом

Если вам нужно вызвать метод получения , используйте метод get. Метод get попадает в базу данных.

public class AccountServiceImpl implements AccountService {

    private SessionFactory sessionFactory;

    public BigDecimal getBalance(Integer acountId) {
        // You need to know your balance
        // So you need to use get method to access the database
        Account account = (Account) sessionFactory.getCurrentSession().get(Account.class, accountId);

        return account.getBalance();
    }

}

Если вам нужно вызвать как метод получения, так и метод установки , используйте метод get.

В ответ на комментарий ChssPly:

JPA с книгой Hibernate говорит о методе загрузки

Метод load () всегда пытается вернуть прокси и возвращает инициализированный экземпляр объекта, только если он уже управляется текущим контекстом постоянства.

И

Он попадает в базу данных, как только вы пытаетесь получить доступ к возвращенному заполнителю и принудительно инициализировать его

Таким образом, он прав, когда вы устанавливаете одно свойство.

Но есть следующий сценарий , показанный в JPA с книгой Hibernate

Обычно постоянный экземпляр получают для назначения его в качестве ссылки на другой экземпляр. Например, представьте, что вам нужен элемент только для одной цели: установить связь с комментарием: aComment.setForAuction (item).

Если это все, что вы планируете делать с предметом, прокси подойдет; нет необходимости ударить базу данных. Другими словами, когда комментарий сохраняется, вам нужно значение внешнего ключа элемента, вставленного в таблицу COMMENT.

Прокси-объект Item предоставляет только это: значение идентификатора, заключенное в заполнитель, который выглядит как реальная вещь.

С уважением,

0 голосов
/ 23 декабря 2009

Как обычно, лучшим справочным материалом для этого является документация :

Session.get():

Возвращать постоянный экземпляр данного класса сущностей с заданным идентификатором, или null, если такого постоянного экземпляра нет . (Если экземпляр или прокси для экземпляра уже связан с сеансом, верните этот экземпляр или прокси.)

Session.load():

Возвращает постоянный экземпляр данного класса сущностей с заданным идентификатором, предполагая, что экземпляр существует.

Вы не должны использовать этот метод, чтобы определить, существует ли экземпляр (используйте вместо него get ()) . Используйте это только для получения экземпляра, который, как вы полагаете, существует, где несуществование будет реальной ошибкой.

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

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