Сеанс Hibernate загружает все данные, которые он читает из БД, в то, что они называют кэш первого уровня . Как только строка загружается из БД, любые последующие выборки для строки с тем же PK возвращают данные из этого кэша. Кроме того, гаранты Hibernate ссылаются на равенство для объектов с одним и тем же PK в одном сеансе.
Насколько я понимаю, ваше серверное приложение только для чтения никогда не закрывает сеанс Hibernate. Поэтому, когда БД обновляется приложением для чтения и записи, Сеанс на сервере, доступном только для чтения, не знает об изменениях. По сути, ваше приложение только для чтения загружает копию базы данных в память и использует эту копию, которая со временем устареет.
Самый простой и лучший способ действий, который я могу предложить, - это закрывать и открывать сессии по мере необходимости. Это обходит всю проблему. Hibernate Sessions предназначены для того, чтобы быть окном для кратковременного взаимодействия с БД. Я согласен с тем, что производительность повышается, если не перезагружать объектный граф снова и снова; но вам нужно измерить это и убедить себя, что это стоит усилий.
Другой вариант - периодически закрывать и открывать сессию. Это гарантирует, что приложение только для чтения работает с данными, не старше, чем заданный интервал времени. Но определенно есть окно, в котором приложение, предназначенное только для чтения, работает с устаревшими данными (хотя проект гарантирует, что в конечном итоге он получит самые последние данные). Это может быть допустимо во многих приложениях - вам нужно оценить вашу ситуацию.
Третий вариант - использовать реализацию кэша второго уровня и использовать краткосрочные сеансы. Существуют различные пакеты кэширования, которые работают с Hibernate с относительными достоинствами и недостатками.