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

Bla*_*dez 6 java hibernate

我正在运行此异常:

Caused by: org.hibernate.HibernateException: Found shared references to a collection: path.Object.listObjects  
Run Code Online (Sandbox Code Playgroud)

这是我的代码:
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;
    }
Run Code Online (Sandbox Code Playgroud)

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;
    }  
Run Code Online (Sandbox Code Playgroud)

请问有人帮我吗?
提前致谢!

编辑异常开始时的点:

ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");  
Run Code Online (Sandbox Code Playgroud)

这来自:

5088 [main] WARN org.apache.commons.vfs.impl.StandardFileSystemManager - no protocol: VFSproviders.xml
java.net.MalformedURLException: no protocol: VFSproviders.xml  
Run Code Online (Sandbox Code Playgroud)

我真的不知道它是什么,但是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>
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*nok 15

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

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

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

  1. 两个线程都查询/定位具有相同ID的对象
  2. Hibernate转到数据库,获取两个相同的对象并开始构建它们
  3. 最终构建的对象使用两者之间共享的一个映射
  4. 在执行刷新或脏检查时,Hibernate会发现问题并抛出异常

在我的所有查询和对象检索上使用synchronized似乎已经解决了我的问题.我建议确保您与Hibernate会话的大多数交互都是同步的,特别要小心交易.希望这有助于任何人遇到同样的问题.


Spl*_*ity 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;
}
Run Code Online (Sandbox Code Playgroud)