2011-11-29 22 views
6

Nếu tôi tiết kiệm một đối tượng chứa danh sách sau đâyHibernateException: Tìm thấy hai cơ quan đại diện của cùng một bộ sưu tập

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

tôi nhận được ngoại lệ

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

Các mã trong Play! điều khiển trông như thế này:

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

Nếu tôi chèn taskList.refresh() trước khối này nó hoạt động, nhưng thông tin vị trí bị mất (dẫn đến lỗi khác).

Đây có phải là lỗi Hibernate hoặc có vấn đề gì với mã của tôi không?

Trả lời

10

Vấn đề là, Hibernate không hỗ trợ kết hợp @OneToMany(mappedBy=...)@OrderColumn. Nếu không có mappedBy Hibernate sử dụng bảng kết nối và mọi thứ hoạt động như mong đợi. Xem explanation.

0

Nếu bạn cần danh sách được duy trì, bạn có thể cần phải chú thích danh sách của mình bằng @OneToMany để có thể duy trì thực thể của bạn.

+0

Bạn nói đúng. Tôi đã bỏ chú thích này để rút ngắn ví dụ của tôi - có lẽ là một ý tưởng tồi. – deamon

-1

vấn đề là với kiểm tra tham gia của bạn cho dù bạn đang không fatching bất kỳ dữ liệu mà không có trong bảng

0

Một lý do khác cho sự ngoại lệ "org.hibernate.HibernateException: Tìm thấy hai cơ quan đại diện của cùng một bộ sưu tập" là thu khí trùng lặp/setters trong thực thể.

0

Lỗi tương tự xảy ra khi bạn cố sửa đổi tập hợp đối tượng liên quan. ví dụ .:

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

Trong trường hợp này, nó có thể được giải quyết bằng cách:

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); 
Các vấn đề liên quan