Часто вы заметите, что разработчики гибернации смешивают использование 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/”