Java Hibernate尝试更新只读对象的版本号
Hibernate抱怨说, 原因: java.lang.UnsupportedOperationException:无法写入只读 反对 org.hibernate.cache.ReadOnlyCache.lock(ReadOnlyCache.java:68) 对于具有Java Hibernate尝试更新只读对象的版本号,java,hibernate,Java,Hibernate,Hibernate抱怨说, 原因: java.lang.UnsupportedOperationException:无法写入只读 反对 org.hibernate.cache.ReadOnlyCache.lock(ReadOnlyCache.java:68) 对于具有@Cache(用法=cacheconcurrentystrategy.READ_ONLY)但未修改的类A类与通过注释定义的B类存在多对多关系 @ManyToMany(cascade = CascadeType.ALL, fe
@Cache(用法=cacheconcurrentystrategy.READ_ONLY)
但未修改的类<代码>A类与通过注释定义的B类
存在多对多
关系
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@MapKey(name = "abbreviation")
private Map<String, B> allBs;
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@MapKey(name=“缩写”)
私有地图;
我正在创建一个a类
的新对象,并将其与B类
的现有对象关联,但由于未知原因,Hibernate试图修改B类
的版本和上次修改的时间
如果我删除了只读注释,它可以正常工作,并且除了连接表a_B
中的一个条目之外,B的版本和上次修改日期会毫无理由地得到更新
这是Hibernate所做的吗?即使只添加了一个新的关联并且对象本身没有更改,也会写入B?似乎Hibernate会在某些操作期间尝试锁定对象,即使对于只读可缓存实体也是如此。我在尝试删除一个(使用Infinispan缓存)时遇到了这个问题。但是,hibernate中处理只读缓存的较低级别部分在尝试任何锁定时都会抛出异常,因为(我猜想)它认为这表示有修改实体的意图
在我看来,这是Hibernate的错误行为。尝试在ReadOnlyCache(以及org.hibernate.cache.infinispan.entity.ReadOnlyCache.java)中注释抛出异常,并在必要时返回null。然后重新编译hibernate/替换jar中的那些.class文件。我不能保证这不会引入与并发缓存访问相关的错误,尽管它似乎对我有效。我面临同样的异常,原因是,当实体被创建并在实体中设置值时。之后,当调用session.save()
方法时,hibernate会对实体中的集合进行一些更改或修改,但我的集合是只读的。我不知道hibernate会做些什么,但是,当我更改用法=CacheConcurrencyStrategy.NONSTRICT\u READ\u WRITE
时,这项工作会成功。我认为您不必放置cascade=CascadeType。由于您的实体是只读的,因此hibernate将对只读实体执行删除操作,并尝试放置CascadeType。对于与只读实体的联接,无缓存是只读的休眠二级缓存。您可以添加
false
在hibernate属性下修复该问题。我也有同样的问题,但当我尝试删除注释时,会生成错误。代码是不可能运行的。