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
时间a_b
1}}。
如果我删除 read_only 注释,它可以正常工作,并且无条件地更新B的版本和上次修改日期,而不是加入表{{1}}中的条目;
这是Hibernate做的事情 - 写入B即使只添加了一个新的关联而对象本身没有改变吗?
答案 0 :(得分:2)
似乎Hibernate试图在某些操作期间锁定对象,即使对于只读可缓存实体也是如此。我试图删除一个(使用Infinispan缓存)时遇到了这个问题。但是,用于处理只读缓存的hibernate的低级部分会在尝试任何锁定时抛出异常,因为(我认为)它认为这表示有意修改实体。
在我看来,这是Hibernate方面的错误行为。尝试在ReadOnlyCache中注释抛出异常(并在org.hibernate.cache.infinispan.entity.ReadOnlyCache.java中),并在必要时返回null。然后重新编译hibernate /替换jar中的那些.class文件。我不能保证这不会引入与并发缓存访问相关的错误,虽然它似乎对我有用。
答案 1 :(得分:1)
我认为您不必放置cascade = CascadeType.ALL,因为您的实体是READ-ONLY,hibernate将在READ-ONLY上执行删除尝试将CascadeType.NONE用于具有READ-ONLY实体的连接
答案 2 :(得分:0)
我面临同样的例外,其背后的原因是,当实体创建并在实体中设置值时。在此之后调用session.save()
方法时,hibernate会对实体中的集合进行一些更改或修改,但我的集合是只读的。更改和修改hibernate的功能,我不知道,但是当我成功更改usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE
这项工作时。
答案 3 :(得分:0)
该缓存是Hibernate二级缓存。您可以添加
<prop key="hibernate.cache.use_second_level_cache">false</prop>
在hibernate属性下修复它。