2010-07-14 34 views
5

Mô hình dữ liệu của tôi được tạo từ các trường học và học sinh. Học sinh có một FK đến trường mà họ thuộc về. Tôi không hiểu lý do tại sao bộ sưu tập chứa các bản sao, tức là Joe, Joe, Mary, Mary, Tom, Tom, v.v. Truy vấn SQL được tạo bởi Hibernate là chính xác và không trả về các bản sao. Tôi có thể thực hiện một hack để lọc ra các bản sao, nhưng tôi chưa sẵn sàng để sống với một cửa sổ bị hỏng nào;) Tôi đã cố dán các phần mã có liên quan bên dưới. Bất kỳ sự trợ giúp nào được đánh giá cao!Hibernate/JPA: các bản sao trong bộ sưu tập trẻ em

// SchoolJpa 

@OneToMany (
    mappedBy = "school", 
    targetEntity = StudentJpa.class, 
    fetch = FetchType.LAZY, 
    cascade = CascadeType.ALL 
) 
@Override 
public List<Student> getStudentsInternal() { 
    return super.getStudentsInternal(); 
} 

// SchoolImpl 

private List<Student> students = new ArrayList<Student>(); 

public List<Student> getStudents() { 
    return Collections.unmodifiableList(students); 
} 

public List<Student> getStudentsInternal() { 
    return students; 
} 

public void setStudentsInternal(List<Students> students) { 
    this.students = students; 
} 
+0

Mã cụ thể bạn đang sử dụng để truy xuất các đối tượng là gì? Hibernate có một số vấn đề được biết đến với một số loại HQL mà sẽ kích hoạt trùng lặp như thế này. – Jherico

Trả lời

1

Khó nói từ đoạn mã nhưng:

  1. Không giống như các bộ, danh sách thường cho phép các yếu tố trùng lặp (vâng, tôi nhận thấy bạn nói câu truy vấn không trả lại bản sao nhưng tôi muốn chỉ ra rằng bạn có thể không sử dụng đúng loại bộ sưu tập).
  2. Đảm bảo bạn triển khai equals/hashCode đúng cách (Tôi nghi ngờ có vấn đề ở cấp này).

Thực ra, bạn có thể hiển thị toàn bộ ánh xạ không? Tôi không chắc chắn để hiểu tại sao bạn có một số getters và setters trên cùng một lĩnh vực.

+0

bằng/hashCode được triển khai chính xác. Sử dụng một Set thực sự giải quyết vấn đề, nhưng tôi coi đây là một hack. setStudentsInternal/getStudentsInternal chỉ dành cho Hibernate (các phương thức này không được định nghĩa trên giao diện) - bộ sưu tập được đóng gói với addStudent, removeStudent và getStudents trả về một bộ sưu tập không thể sửa đổi được. – Francois

+0

@Francois: Sử dụng 'Set' không phải là hack nhưng nó có thể che giấu nguyên nhân thực sự của vấn đề (đó có thể là lý do bạn gọi nó là hack) nhưng tôi không thể nói gì thêm nếu bạn không cung cấp thêm mã (ánh xạ chính xác). Ngoài ra, việc cung cấp nội dung bảng và truy vấn/truy vấn được thực hiện sẽ giúp ích. –

13

Đoán của tôi là bạn có một FetchType.EAGER hoặc ánh xạ khác trong trường học sẽ gây ra một truy vấn tham gia bên ngoài được phát hành bởi Hibernate, điều này sẽ dẫn đến trùng lặp trong danh sách.

Các loại chuyển đổi thành SET hoạt động vì một tập hợp tự nhiên de-dupes dựa trên sự bình đẳng, do đó các bản sao được trả về bởi truy vấn nối ngoài bị mất.

Một nhiều kỹ hơn lời giải thích bởi Eran Medan sẵn here:

0

nhớ nghĩ rằng bạn đang thêm điều cần bộ sưu tập đã tồn tại cho đối tượng đó. Không thể chắc chắn nếu không nhìn thấy mã nơi bạn đang thêm nội dung vào bộ sưu tập của Học sinh của trường, nhưng đó sẽ là phỏng đoán của tôi.

Các vấn đề liên quan