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

时间:2011-11-02 23:34:08

标签: java hibernate

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即使只添加了一个新的关联而对象本身没有改变吗?

4 个答案:

答案 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属性下修复它。