Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate尝试更新只读对象的版本号_Java_Hibernate - Fatal编程技术网

Java Hibernate尝试更新只读对象的版本号

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

Hibernate抱怨说, 原因:

java.lang.UnsupportedOperationException:无法写入只读 反对 org.hibernate.cache.ReadOnlyCache.lock(ReadOnlyCache.java:68)

对于具有
@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属性下修复该问题。

我也有同样的问题,但当我尝试删除注释时,会生成错误。代码是不可能运行的。