2011-11-29 10 views
6

Se salvare un oggetto che contiene il seguente elencoHibernateException: Trovato due rappresentazioni della stessa collezione

@OneToMany(cascade=CascadeType.ALL, mappedBy="taskList") 
@OrderColumn(name="position", nullable=false) 
public List<Task> tasks = new ArrayList<Task>(); 

ottengo l'eccezione

org.hibernate.HibernateException: Found two representations of same collection 

Il codice nel gioco! Controller si presenta così:

TaskList taskList = taskList.findById(taskListId); 
taskList.add(position, task); 
taskList.save(); 

Se inserisco taskList.refresh() prima di questo blocco che funziona, ma l'informazione di posizione viene persa (che porta ad altri errori).

Si tratta di un errore Hibernate o di qualcosa che non va nel mio codice?

risposta

10

Il problema era che Hibernate non supporta la combinazione di @OneToMany(mappedBy=...) e @OrderColumn. Senza mappedBy Hibernate utilizza una tabella di join e tutto funziona come previsto. Vedi explanation.

0

Se è necessario mantenere l'elenco persistente, è possibile che sia necessario annotare l'elenco con @OneToMany per poter mantenere la propria entità.

+0

Hai ragione. Ho omesso questa annotazione per abbreviare il mio esempio, probabilmente una cattiva idea. – deamon

-1

il problema è con il vostro assegno di entrare se non si fatching tutti i dati che non è nella tabella

0

Un altro motivo per l'eccezione "org.hibernate.HibernateException: Trovato due rappresentazioni di stessa collezione" è getter duplicati/setter nell'entità.

0

Lo stesso errore si verifica quando si tenta di modificare una raccolta associata di un oggetto. es .:

MyObject myObject = myObjectService.get(id); 
    List<Task> newTasks = //populate new list of Task here 
    myObject.setTasks(newTasks); 
    myObjectService.saveOrUpdateObject(myObject); // or merge(myObject)  

In tal caso, esso può essere risolto:

MyObject myObject = myObjectService.get(id); 
    List<Task> newTasks = //populate new list of Task here 
    myObject.setTasks(new List<Task>); // or myObject.getTasks().clear(); 
    myObject.getTasks().addAll(newTasks); 
    myObjectService.merge(myObject); 
Problemi correlati