Что делает метод load () Hibernate для несуществующих идентификаторов? - PullRequest
6 голосов
/ 15 сентября 2011

Я немного сбит с толку JavaDocs на Session.load :

Вернуть постоянный экземпляр заданного класса сущности с заданным идентификатором, предполагая, что экземпляр существует. Этот метод может вернуть прокси-экземпляр, который инициализируется по требованию, при обращении к методу без идентификатора.

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

Я понимаю, что должен использовать get, но я не понимаю, что подразумевается под битом, инициализируемым по требованию, когда используется неидентификатор.

Для меня, если у меня есть класс и я использую load(MyClass.class, NonExistingID), а затем печатаю вывод getId() на возвращенном экземпляре, похоже, он автоматически создает новый экземпляр с NonExistingID каждый раз. Почему это?

Я просто пытаюсь понять, является ли getId() неидентифицирующим методом?

Ответы [ 2 ]

7 голосов
/ 15 сентября 2011

Просто вкратце:

session.load создаст прокси-объект, который будет инициализирован при вызове любого получателя элемента класса не первичного ключа.

session.get вернет ноль, если объект не существует, и вернет полный объект, если он существует.

5 голосов
/ 15 сентября 2011

«Неидентификационный метод» означает метод, который возвращает что-то, кроме идентификатора (как в первичном ключе id) для объекта. load дает вам прокси, где прокси запрашивает базу данных только тогда, когда вы запрашиваете что-то, кроме идентификатора. Так что getId - это метод идентификатора, Hibernate не запрашивает у базы данных его значение (это не нужно, потому что вы передали его в вызов метода load).

Найден этот фрагмент на спящих форумах :

Важный сценарий, при котором вам необходимо сопоставить нагрузку и получить методы Hibernate Session имеет отношение к тому, что происходит, когда Вы предоставляете первичный ключ, который фактически не существует в базе данных. Ну, с помощью метода get, вы просто возвращаете нулевой объект, что не страшно.

При использовании метода загрузки также не возникает начальных проблем при вводе неверный первичный ключ метода. Из того, что вы можете сказать, Похоже, что Hibernate вернет вам действительный ненулевой экземпляр класс, в котором вы заинтересованы. Однако проблемы начинаются, когда вы на самом деле пытаетесь получить доступ к свойству этого экземпляра - вот где у тебя неприятности.

Помните, как я сказал, метод загрузки не попадает в базу данных, пока свойство боба запрашивается? Хорошо, если вы предоставили основной ключ, который не существует в вашей базе данных для метода загрузки, когда он действительно идет в базу данных в первый раз, он не сможет найти несуществующая, связанная запись, и ваш код будет сильно кашлять время. На самом деле, поиск поля на основе несуществующего первичного ключ с помощью метода загрузки Hibernate Session вызывает следующее Ошибка:

org.hibernate.ObjectNotFoundException: нет строки с данным идентификатор существует: [Пользователь # 123]

Похоже, вы использовали load, чтобы получить прокси для несуществующего объекта, но так как вы не вызвали никаких «неидентификационных методов» для него, вы не заставили прокси обращаться к базе данных и не получил ошибку.

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