我正在运行此例外:
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>
我完全迷失在这一部分,任何帮助都会非常感激。感谢
答案 0 :(得分:14)
过去曾多次回答过这个问题,但是我遇到了一个新案例,引发了与多线程相关的异常,并决定在此发帖,因为这是搜索异常时的最佳结果之一。
在我的情况下,我在hibernate中包装了一个简单的数据结构,然后包装在我自己的框架(几个管理器)中,供其他项目使用。管理员执行所有基本的CRUD操作以及一些查询和管理会话(或根据设置提供这样做的界面)。所有实体都包含一个String to String映射,如果需要,它用于使用其他参数扩展对象。地图存储在单独的表中。在一个用例中,管理器在多个线程之间共享,并且仅用于检索对象。要检索的对象ID来自同一个列表,如果线程同时需要相同的对象,则会抛出可怕的Found共享引用异常。
我明白背后的原理是这样的:
在我的所有查询和对象检索上使用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;
}