Из вашего описания вы, вероятно, используете Hibernate кэш 2-го уровня (кластер или кэш уровня JVM), и когда вы обновляете базу данных напрямую, вы явно игнорируете API Hibernate, и Hibernate не получает возможности очистить кэш, чтобы он мог обновляться.
Если вы не хотите перезагружать сервер, избегайте ручных обновлений или , явно указав Hibernate очистить соответствующие части кэша после обновления вручную, чтобы данные были перезагружены. Вы можете сделать это, используя различные перегруженные evict()
методы на уровне SessionFactory
.
Из документации по Hibernate:
...
Для кеша второго уровня есть
методы, определенные в SessionFactory для
высвобождая кэшированное состояние
экземпляр, весь класс, коллекция
роль экземпляра или всей коллекции.
sessionFactory.evict(Cat.class, catId); //evict a particular Cat
sessionFactory.evict(Cat.class); //evict all Cats
sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections
Конечно, это потребует некоторых знаний о том, что кэшируется в вашем приложении и что обновляется вашим клиентом. Но кто-то должен это знать.
Ссылки
- Справочная документация по Hibernate Core