Вот общее обсуждение проблемы Open Session in View . Я рекомендую вам прочитать статью.
Проще говоря, у вас есть 3 возможных решения:
1) не выполнять ленивую загрузку коллекции (конечно, если это не критично, производительность должна быть как-то проверена):
@OneToMany(fetch=FetchType.EAGER) // <-- it's not lazy any more
@JoinColumn(name = "Id", referencedColumnName="TranslatableDescriptionId", insertable=false, updatable=false)
private Set<TranslatableText> translatableText;
2) вы можете использовать Open Session в View Filter (или OpenEntityManagerInViewFilter), но это будет держать ваш сеанс открытым до завершения загрузки страницы (возможно, несколько секунд).
Это может вызвать проблемы с производительностью, и, скорее всего, вы получите ситуацию, когда один пользователь меняет объекты, в то время как другой пользователь имеет открытый сеанс гибернации. Я не знаю точно, что тогда произойдет, но вы должны это выяснить, если хотите быть уверенными в надежности своего приложения.
3) когда вам нужно загрузить некоторую коллекцию из БД, просто выполните запрос JPA и извлеките все необходимые данные специальным методом DAO (это означает, что поле translatableText
исчезнет из класса CategoryType
). Самое надежное решение, но вам нужно проделать дополнительную работу для его реализации, оно сложнее, чем любой из двух предыдущих вариантов.