2011-04-18 35 views
5

我运行此异常:产生的原因:org.hibernate.HibernateException:创建共享的集合引用

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", 
      [email protected](name="object_id", unique=true) , 
      [email protected](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", 
      [email protected](name="list_id"), 
      [email protected](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> 

I我完全失去了这部分,任何帮助将非常感激。谢谢

+0

我以前在这里回答了同样的问题: http://stackoverflow.com/questions/1692871/found-shared-references-to-a-collection-org-hibernate-hibernateexception/7972414#7972414 – dgt 2011-11-01 20:56:22

+0

什么在公开列表中注释 getListObjects(){ return listObjects; }? – 2015-06-19 14:00:07

+0

我遇到了同样的异常,对我来说,它是由于我的实体类的继承路径中有两次相同的属性造成的。 – kaefert 2015-07-02 11:53:31

回答

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; 
} 
+0

谢谢@Charles,也许你是对的,但它不能解决我的问题。我得到同样的例外。 – 2011-04-18 10:22:48

+0

在您将数据加载到内存或对其进行了某些操作后会发生这种情况吗?通过hibernate线程阅读,这似乎指的是基本的东西是当你有一个分配给多个实体的托管集合。每个实体都应该有它自己的Collection对象,尽管它们中包含的实体可能是重复的。 – SplinterReality 2011-04-19 01:39:17

+0

当我将数据存储到数据库时发生这种情况。 listObjects有更多的对象,我怎么能在它们之间做出区别?每次引用它时,它都是一个新数组,它应该在每个包含它的表内的不同圆柱体中。感谢您的评论 – 2011-04-19 08:35:31

13

这个问题在过去已经回答了无数次,但我已经遇到了提高有关多线程相同的异常,并决定张贴在这里,因为这是谷歌搜索的时候结果的最前面的一个新案例例外。

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

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

  1. 两个线程查询/定位对象,都用相同的ID
  2. 休眠进入到数据库,得到两个相同的对象,并开始建设起来
  3. 目的结束被建立与两个
  4. 之间共享在这样做的冲洗或脏检查休眠一个地图中发现的问题和抛出异常

在我所有的查询和对象检索中使用同步似乎已经解决了我的问题。我建议确保大部分与Hibernate会话的交互是同步的,尤其要小心事务。希望这有助于任何人陷入同样的​​问题。

+0

这听起来正是我遇到的问题。谢谢! – jmh 2013-08-02 20:04:00

+1

准确地说我的问题。由于我使用Java8,它是由使用parallelStream而不是流(来自操纵我的实体的一系列Fuctions)引起的。 – 2014-08-18 05:01:59

相关问题