Вы также можете использовать refresh
для перезагрузки объекта. Или evict
и clear
, как упомянуто @ Божо.
При использовании пула соединений накладные расходы на открытие и закрытие сеанса невелики. Что требует времени, так это построить фабрику сессий.
Проблема с закрытием и повторным открытием сеанса заключается в том, что уже загруженный объект все равно будет отсоединен, если я хорошо помню. Это может быть проблематично с ленивой загрузкой. Поэтому лучше держать сеанс открытым и использовать evict
, clear
или refresh
.
Обратите внимание, что если вы выселите сущность и получите доступ к одной такой уже загруженной сущности, вы все равно получите старые данные.
MyEntity e = session.load( ... );
...
session.evict(e); // remove entity from the cache
String p = e.myProperty; // still the value at the time it was loaded
e = sesssion.load( ... ); // latest value
В вашем случае, возможно, было бы лучше ввести руководство по проектированию, которое гласит, что всякий раз, когда сущностью манипулируют, ее следует сначала обновить.
MyEntity e = session.load( ... );
...
session.refresh( e ); // refresh entity and cache
String p = e.myProperty; // latest value
e = sesssion.load( ... ); // latest value
Код выше - только псевдокод, я его не проверял.
Обратите внимание, что если сеанс открывается в течение определенного времени, кэш может увеличиться, и в этом случае вы можете захотеть его clear
. В целом, однако, лучше избегать коротких сессий, чтобы избежать этой проблемы, связанной с ростом кэша, а также проблемами с тайм-аутом соединения, таймаутом транзакции и конфликтами блокировок.