Рубрики
Без рубрики

Отличается между session.get() и session.load()

– Отличается между session.get() и session.load()

Часто вы заметите, что разработчики гибернации смешивают использование session.get() и загрузка сеанса() , вам интересно, в чем разница и когда вы должны использовать любой из них?

Отличается между session.get() и session.load()

На самом деле, обе функции, конечно, используются для извлечения объекта с другим механизмом.

1. сеанс.загрузка()

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

2. сеанс.получить()

  • Он всегда попадает в базу данных и возвращает реальный объект, объект, представляющий строку базы данных, а не прокси.
  • Если строка не найдена, она возвращает null .

Речь идет о производительности

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

1. сеанс.получить()

Например, в приложении для акций операции с акциями и акциями должны иметь отношение “один ко многим”, когда вы хотите сохранить транзакцию с акциями, обычно объявляется что-то вроде приведенного ниже

           
    	   Stock stock = (Stock)session.get(Stock.class, new Integer(2));
           StockTransaction stockTransactions = new StockTransaction();
           //set stockTransactions detail
           stockTransactions.setStock(stock);        
           session.save(stockTransactions);

Выход

Hibernate: 
    select ... from mkyong.stock stock0_ 
    where stock0_.STOCK_ID=?
Hibernate: 
    insert into mkyong.stock_transaction (...) 
    values (?, ?, ?, ?, ?, ?)

В session.get() функция Hibernate попадет в базу данных, чтобы получить объект Stock и поместить его в качестве ссылки на StockTransaction. Тем не менее, этот процесс сохранения чрезвычайно востребован, может быть тысяча или миллион транзакций в час, как вы думаете, необходимо ли это для доступа к базе данных для извлечения объекта акций, чтобы сохранить запись о сделке с акциями? В конце концов, вам просто нужен идентификатор акции в качестве ссылки на биржевую транзакцию.

2. сеанс.загрузка()

В приведенном выше сценарии session.load() будет вашим хорошим решением, давайте посмотрим пример,

           
    	   Stock stock = (Stock)session.load(Stock.class, new Integer(2));
           StockTransaction stockTransactions = new StockTransaction();
           //set stockTransactions detail
           stockTransactions.setStock(stock);        
           session.save(stockTransactions);

Выход

Hibernate: 
    insert into mkyong.stock_transaction (...) 
    values (?, ?, ?, ?, ?, ?)

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

Исключение

В исключительном случае см. Примеры

сеанс.загрузка()

Stock stock = (Stock)session.load(Stock.class, new Integer(100)); //proxy

 //initialize proxy, no row for id 100, throw ObjectNotFoundException
System.out.println(stock.getStockCode());

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

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: 
[com.mkyong.common.Stock#100]

сеанс.получить()

//return null if not found
Stock stock = (Stock)session.get(Stock.class, new Integer(100)); 
System.out.println(stock.getStockCode()); //java.lang.NullPointerException

Он всегда будет возвращать значение null, если значение идентификатора не найдено в базе данных.

Вывод

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

Оригинал: “https://mkyong.com/hibernate/different-between-session-get-and-session-load/”