В чем преимущество load () vs get () в Hibernate?

Может ли кто-нибудь сказать мне, в чем преимущество load () vs get () в Hibernate?

Какое преимущество load () vs get () в Hibernate?

введите описание изображения здесь
источник

Proxy означает, что hibernate подготовит некоторый поддельный объект с заданным значением идентификатора в памяти без попадания в базу данных.
введите описание изображения здесь

Например:
Если мы вызываем session.load(Student.class,new Integer(107));

hibernate создаст один поддельный объект Student [row] в памяти с идентификатором 107, но остальные свойства classа Student даже не будут инициализированы.

Источник

Объяснение семантики этих методов не объясняет практической разницы между ними. Практическое правило:

  • Используйте get() когда вы хотите загрузить объект

  • Используйте load() когда вам нужно получить ссылку на объект без выдачи дополнительных SQL-запросов, например, для создания отношения с другим объектом:

     public void savePost(long authorId, String text) { Post p = new Post(); p.setText(text); // No SELECT query here. // Existence of Author is ensured by foreign key constraint on Post. p.setAuthor(s.load(Author.class, authorId)); s.save(p); } 

Из книги «Сохранение Java с спящим режимом», стр. 405:

Единственное различие между get () и load () заключается в том, как они указывают, что экземпляр не найден. Если в базе данных нет строки с заданным значением идентификатора , get () возвращает значение null . Метод load () генерирует исключение ObjectNotFoundException . Вы выбираете, какую обработку ошибок вы предпочитаете.

Что еще более важно, метод load () может возвращать прокси-сервер , не заполнив базу данных . Следствием этого является то, что позже вы можете получить ObjectNotFoundException, как только вы попытаетесь получить доступ к возвращенному заполнителю и принудительно его инициализировать (это также называется ленивой загрузкой, мы обсуждаем оптимизацию загрузки в последующих главах). Метод load () всегда пытается вернуть прокси-сервер и возвращает только экземпляр инициализированного объекта, если он уже управляется текущим контекстом персистентности. В примере, показанном ранее, никакого попадания в базу данных не происходит вообще! Метод get (), с другой стороны, никогда не возвращает прокси, он всегда попадает в базу данных .

Вы можете спросить, почему этот параметр полезен. В конце концов, вы получаете объект для доступа к нему. Обычно возникает постоянный экземпляр для назначения его в качестве ссылки на другой экземпляр. Например, представьте, что вам нужен элемент только для одной цели: установить связь с комментарием: aComment.setForAuction (item). Если это все, что вы планируете делать с этим элементом, прокси-сервер будет работать нормально; в базе данных нет необходимости. Другими словами, когда комментарий сохраняется, вам нужно значение внешнего ключа элемента, вставленного в таблицу COMMENT. Прокси-элемент элемента предоставляет только это: значение идентификатора, заключенное в местозаполнитель, который выглядит как реальная вещь.

load вернет прокси-объект.

get вернет фактический объект и возвращает null, если он не найдет какой-либо объект.

A: Это объясняется в справочной системе спящего режима. Одно из отличий – это производительность, а другая – то, что загрузка выдает неисправимое исключение, если для ID не найден объект.

Подробнее здесь

  • Используйте get (), когда вы хотите загрузить объект
  • Используйте load (), когда вам нужно получить ссылку на объект без выдачи дополнительных SQL-запросов, например, для создания отношения с другим объектом:

Пример: если вы пытаетесь загрузить / получить объект Empoyee, где empid = 20. Но предположим, что запись недоступна в БД.

  Employee employee1 = session.load(Employee.class,20); //Step-1 system.out.println(employee1.getEmployeeId(); //Step-2 --o/p=20 system.out.println(employee1.getEmployeeName(); //Step-3 -->O/P:ObjectNotFoundException 

Если вы используете загрузку в спящем режиме с шагом 1, не запускайте какой-либо запрос выбора для извлечения записи сотрудника из БД в этот момент. В этом спящем режиме пинты дается фиктивный объект (прокси). Этот фиктивный объект не содержит ничего. это новый сотрудник (20). вы можете проверить это на шаге 2, он будет печатать 20. но на шаге 3 мы пытаемся найти информацию о сотрудниках. поэтому в это время hibernate запускает sql-запрос для извлечения Empoyee objct. Если он не найден в DB.throws ObjectNotFoundException.

 Employee employee2 = session.get(Employee.class,20); //Step-4 

для session.get () hibernate запускает sql-запрос для извлечения данных из db. поэтому в нашем случае id = 20 не существует в БД. поэтому он возвращает null.

Проблемы с производительностью также являются существенной разницей между методом get и load.

Метод get () извлекает данные, как только он выполняется, когда метод load () возвращает прокси-объект и извлекает только данные, когда требуются свойства объекта. Так что метод load () получает лучшую производительность, так как поддерживает ленивую загрузку. Whe должен использовать метод load () только тогда, когда мы знаем, что данные существуют, потому что он выдает исключение, когда данные не найдены. Если мы хотим убедиться, что данные существуют, мы должны использовать метод get ().

Короче говоря, вы должны понимать разницу между ними и решать, какой метод лучше всего исправить в вашем приложении.

Я нашел эти различия в учебнике. Разница между методом get и load в Hibernate

Когда Load вызывается, он возвращает объект Proxy. Фактический запрос выбора еще не запущен. Когда мы используем какое-либо из отображаемого свойства, первый запрос запускается. Если строка не существует в БД, она будет генерировать исключение. например

 Software sw = ( Software )session.load(Software.class, 12); 

Здесь sw имеет тип прокси. И выбор запроса еще не вызван. в отладчике Eclipse вы можете увидеть его как

 sw Software$$EnhancerByCGLIB$$baf24ae0 (id=17) CGLIB$BOUND true CGLIB$CALLBACK_0 CGLIBLazyInitializer (id=23) CGLIB$CALLBACK_1 null CGLIB$CONSTRUCTED true id null prop1 null softwareprop null 

когда я использую

  sw.getProp1() 

запрос выбора запускается. И теперь прокси теперь знает значения для всех отображаемых свойств.

Где, как и при вызове get, немедленно вызывается запрос. Возвращаемый объект не является прокси, а действительным classом. например

 Software sw = ( Software )session.get(Software.class, 12); 

Здесь sw является типом программного обеспечения. Если строка существует, то все отображаемые свойства заполняются значениями в БД. Если строка не существует, то sw будет null.

 sw Software (id=17) id Integer (id=20) prop1 "prodjlt1" (id=23) softwareprop "softwrjlt1" (id=27) 

Как всегда, используйте нагрузку, только если вы уверены, что запись существует в БД. В этом случае безопасно работать с прокси-сервером и будет полезно отложить запрос БД до тех пор, пока на самом деле не будет выполнено сопоставленное свойство.

session.load () : он всегда будет возвращать прокси-объект с заданным значением идентичности, даже значение идентификатора не существует в базе данных. Однако при попытке инициализировать прокси-сервер, извлекая его свойства из базы данных, он попадет в базу данных с помощью оператора select. Если ни одна строка не найдена, объект ObjectNotFoundException будет бросать.

session.get () : он всегда возвращает null, если значение идентификатора не найдено в базе данных.

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

С load () мы можем распечатать идентификатор, но как только мы попытаемся получить доступ к другим полям, он запускает запрос к базе данных и выдает org.hibernate.ObjectNotFoundException, если нет записи, найденной с данным идентификатором. Это hibernate specific Execution Execution, поэтому нам не нужно явно его поймать.

  • Можем ли мы использовать стиль кнопки GTK + 2.0 в Java Swing?
  • Как я могу получить количество строк в файле эффективным способом?
  • Hibernate: org.hibernate.LazyInitializationException: не удалось инициализировать прокси - нет сеанса
  • синхронизированный блок для объекта Integer
  • Использование Enums при parsingе JSON с помощью GSON
  • В чем смысл дополнительного classа Guava?
  • В чем разница между переменной, объектом и ссылкой?
  • Использование файлов .html как JSP
  • Java - уникальная дата
  • Для чего используется ключевое слово «volatile»?
  • Добавить зависимость в Maven
  • Давайте будем гением компьютера.