Hibernate пытается обновить номер версии объекта только для чтения - PullRequest
2 голосов
/ 03 ноября 2011

Hibernate жалуется, Вызвано:

java.lang.UnsupportedOperationException: Не удается записать только для чтения объект в org.hibernate.cache.ReadOnlyCache.lock (ReadOnlyCache.java:68)

для класса, который имеет @Cache(usage = CacheConcurrencyStrategy.READ_ONLY), но не изменен. Class A имеет отношение many-to-many с Class B, определенным с помощью аннотации,

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @MapKey(name = "abbreviation")
    private Map<String, B> allBs;

Я создаю новый объект Class A и связываю его с существующим объектом Class B, но по неизвестной причине Hibernate пытается изменить версию и lastmodified время Class B.

Если я удаляю аннотацию read_only , она работает нормально, и безо всякой причины обновляется версия и дата последнего изменения B, кроме записи в присоединяемой таблице a_b;

Это то, что делает Hibernate - записать B, даже если добавлена ​​только новая ассоциация, а сам объект не изменен?

Ответы [ 4 ]

2 голосов
/ 24 января 2012

Похоже, что Hibernate пытается заблокировать объекты во время определенных операций, которые разрешены даже для кэшируемых объектов, доступных только для чтения.Я столкнулся с этим, пытаясь удалить один (с кешем Infinispan).Однако часть более низкого уровня hibernate для работы с кэшем только для чтения выдает исключение всякий раз, когда предпринимается попытка какой-либо блокировки, потому что (я полагаю) считает, что это означает намерение изменить сущность.

мне было бы неправильно поведение со стороны Hibernate.Попробуйте закомментировать выброс исключения в ReadOnlyCache (и в org.hibernate.cache.infinispan.entity.ReadOnlyCache.java тоже) и, при необходимости, вернуть null.Затем перекомпилируйте hibernate / замените эти файлы .class в банке.Я не могу обещать, что это не приведет к ошибке, связанной с одновременным доступом к кешу, хотя, похоже, она работает для меня.

1 голос
/ 21 апреля 2015

я думаю, что вам не нужно помещать cascade = CascadeType.ALL, поскольку ваша сущность только для чтения, hibernate выполнит удаление только для чтения, попытается поместить CascadeType.NONE для объединения с сущностью READ-ONLY.

0 голосов
/ 08 июня 2016

Этот кэш - это кэш второго уровня Hibernate. Вы можете добавить

<prop key="hibernate.cache.use_second_level_cache">false</prop>

в свойствах гибернации, чтобы исправить это.

0 голосов
/ 19 июня 2013

Я сталкиваюсь с тем же исключением, причина в том, что объект создается и устанавливает значения в объекте. После этого, когда вызывается метод session.save(), hibernate делает некоторые изменения или модификации с коллекциями в сущности, но мои коллекции доступны только для чтения. Изменения и модификации, что делают Hibernate, я не знаю, но когда я изменяю usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE, это успешно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...