Вызвано: org.hibernate.HibernateException: найдены общие ссылки на коллекцию - PullRequest
6 голосов
/ 18 апреля 2011

Я запускаю это исключение:

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 ]

15 голосов
/ 19 октября 2011

В прошлом на этот вопрос много раз отвечали, но я столкнулся с новым случаем, в котором возникает то же исключение, связанное с многопоточностью, и решил опубликовать здесь, потому что это один из лучших результатов при поиске в поисках исключения.

В моем случае я обернул простую структуру данных в hibernate, а затем обернул в свою собственную среду (пару менеджеров) для использования в других проектах. Менеджеры выполняют все основные операции CRUD, а также выполняют несколько запросов и управляют сессиями (или предоставляют интерфейс для этого на основе настроек). У всех сущностей есть карта String to String, и она используется для расширения объектов дополнительными параметрами, если это необходимо. Карта хранится в отдельной таблице. В одном случае использования менеджер распределяется между несколькими потоками и используется только для извлечения объектов. Идентификаторы объектов для извлечения исходят из одного и того же списка, и если потоки требуют один и тот же объект в одно и то же время, возникает исключение страшных общих ссылок.

Я понимаю, что принцип, стоящий за этим, примерно такой:

  1. Оба потока запрашивают / находят объект, оба с одинаковым идентификатором
  2. Hibernate отправляется в БД, получает два идентичных объекта и начинает их создавать
  3. В итоге объекты строятся с одной картой, общей для двух
  4. После выполнения очистки или грязной проверки Hibernate обнаруживает проблему и выдает исключение

Использование синхронизации во всех моих запросах и поиске объектов, похоже, решило проблему для меня. Я бы посоветовал убедиться, что большинство ваших взаимодействий с сеансами Hibernate синхронизированы, особенно внимательно относясь к транзакциям. Надеюсь, это поможет любому, кто застрянет с такой же проблемой.

1 голос
/ 18 апреля 2011

Разве вы не должны использовать атрибут @OneToMany "mappedBy" на стороне OneToMany этого соединения вместо указания 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...