引起:org.hibernate.HibernateException:找到对集合的共享引用

时间:2011-04-18 09:47:37

标签: java hibernate

我正在运行此例外:

Caused by: org.hibernate.HibernateException: Found shared references to a collection: path.Object.listObjects  

这是我的代码:
Object.java

protected List<ListedObject> listObjects ;  

....  
@OneToMany(cascade=CascadeType.ALL)
    @JoinTable(
            name = "object_list", 
            joinColumns=@JoinColumn(name="object_id", unique=true)  ,
            inverseJoinColumns=@JoinColumn(name="list_id")
    )
    public List<Annotation> getListObjects() {
        return listObjects;
    }
    public void setListObjects(List<ListedObject> listObjects){
        this.listObjects = listObjects;
    }

ListedObject.java

private Object object;  

...  

@ManyToOne(cascade=CascadeType.MERGE)
    @JoinTable(name = "object_list", 
            joinColumns=@JoinColumn(name="list_id"),
            inverseJoinColumns=@JoinColumn(name="object_id"))
    public MediaObject getObject() {
        return mediaObject;
    }

    public void setObject(Object object) {
        this.object = object;
    }  

有人可以帮帮我,请问? 提前谢谢!

编辑异常开始时的点:

ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");  

这来自:

5088 [main] WARN org.apache.commons.vfs.impl.StandardFileSystemManager - no protocol: VFSproviders.xml
java.net.MalformedURLException: no protocol: VFSproviders.xml  

我真的不知道它是什么,但VFSproviders.xml在项目中,并且它有:

<?xml version="1.0" encoding="UTF-8"?>
<providers>
    <provider class-name="org.apache.commons.vfs.provider.zip.ZipFileProvider">
        <scheme name="zip"/>
    </provider>
    <extension-map extension="zip" scheme="zip"/>
    <mime-type-map mime-type="application/zip" scheme="zip"/>
    <provider class-name="org.apache.commons.vfs.provider.ftp.FtpFileProvider">
        <scheme name="ftp"/>
        <if-available class-name="org.apache.commons.net.ftp.FTPFile"/>
    </provider>
    <default-provider class-name="org.apache.commons.vfs.provider.local.DefaultLocalFileProvider"/>
</providers>

我完全迷失在这一部分,任何帮助都会非常感激。感谢

2 个答案:

答案 0 :(得分:14)

过去曾多次回答过这个问题,但是我遇到了一个新案例,引发了与多线程相关的异常,并决定在此发帖,因为这是搜索异常时的最佳结果之一。

在我的情况下,我在hibernate中包装了一个简单的数据结构,然后包装在我自己的框架(几个管理器)中,供其他项目使用。管理员执行所有基本的CRUD操作以及一些查询和管理会话(或根据设置提供这样做的界面)。所有实体都包含一个String to String映射,如果需要,它用于使用其他参数扩展对象。地图存储在单独的表中。在一个用例中,管理器在多个线程之间共享,并且仅用于检索对象。要检索的对象ID来自同一个列表,如果线程同时需要相同的对象,则会抛出可怕的Found共享引用异常。

我明白背后的原理是这样的:

  1. 两个线程都查询/定位一个具有相同ID的对象
  2. Hibernate转到数据库,获取两个相同的对象并开始构建它们
  3. 最终构建的对象使用两个
  4. 之间共享的地图
  5. 执行刷新或脏检查时,Hibernate会发现问题并抛出异常
  6. 在我的所有查询和对象检索上使用synchronized似乎已经解决了我的问题。我建议确保大多数与Hibernate会话的交互都是同步的,特别要小心交易。希望这有助于任何人遇到同样的问题。

答案 1 :(得分:1)

你不应该在这个连接的OneToMany端使用@OneToMany属性“mappedBy”而不是指定JoinTable吗?

根据我的经验,您可以在关系的拥有方定义关系,并使用自有方的“mappedBy”属性将其映射回来。

protected List<ListedObject> listObjects ;  

@OneToMany(cascade=CascadeType.ALL,mappedBy="Object")
public List<ListedObject> getListObjects() {
    return listObjects;
}
public void setListObjects(List<ListedObject> listObjects){
    this.listObjects = listObjects;
}