2011-11-29 22 views
6

如果我保存對象包含以下列表HibernateException的:發現同一個集合的兩種表示

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

我得到的異常

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

戲中的代碼!控制器看起來是這樣的:

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

如果我這一塊它的工作原理之前插入taskList.refresh(),但位置信息丟失(這會導致其他錯誤)。

這是一個Hibernate的bug還是我的代碼有問題?

回答

10

問題是,Hibernate不支持@OneToMany(mappedBy=...)@OrderColumn的組合。沒有mappedBy Hibernate使用連接表,並且一切按預期工作。請參閱explanation

0

如果您需要保留列表,您可能需要使用@OneToMany註釋您的列表以便能夠保留您的實體。

+0

你是對的。我忽略了這個註釋來縮短我的例子 - 可能是一個壞主意。 – deamon

-1

的問題是您的加盟檢查是否你不fatching任何數據,該數據表中沒有

0

的另一個原因異常「org.hibernate.HibernateException:發現同一個集合的兩種表示」是重複的getter/setters在實體中。

0

當您嘗試修改對象的關聯集合時發生同樣的錯誤。例如: -

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

在這種情況下,就可以解決的:

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); 
相關問題