簡體   English   中英

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

[英]Caused by: org.hibernate.HibernateException: Found shared references to a collection

我正在運行此異常:

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>

我完全迷失在這一部分,任何幫助都會非常感激。 謝謝

這個問題在過去已經被多次回答了,但是我遇到了一個新的案例,它提出了與多線程相關的異常,並決定在這里發帖,因為這是google搜索異常時的最佳結果之一。

在我的例子中,我在hibernate中包裝了一個簡單的數據結構,然后包裝在我自己的框架(幾個管理器)中,供其他項目使用。 管理員執行所有基本的CRUD操作以及一些查詢和管理會話(或根據設置提供這樣做的界面)。 所有實體都包含一個String to String映射,如果需要,它用於使用其他參數擴展對象。 地圖存儲在單獨的表中。 在一個用例中,管理器在多個線程之間共享,並且僅用於檢索對象。 要檢索的對象ID來自同一個列表,如果線程同時需要相同的對象,則拋出可怕的Found共享引用異常。

我明白背后的原理是這樣的:

  1. 兩個線程都查詢/定位具有相同ID的對象
  2. Hibernate轉到數據庫,獲取兩個相同的對象並開始構建它們
  3. 最終構建的對象使用兩者之間共享的一個映射
  4. 在執行刷新或臟檢查時,Hibernate會發現問題並拋出異常

在我的所有查詢和對象檢索上使用synchronized似乎已經解決了我的問題。 我建議確保大多數與Hibernate會話的交互都是同步的,特別要小心交易。 希望這有助於任何人遇到同樣的問題。

你不應該在這個連接的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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM