Sự khác biệt giữa việc sử dụng một chú thích @OneToMany
và @ElementCollection
chú thích vì cả hai đều hoạt động trên mối quan hệ một-nhiều?
Sự khác biệt giữa việc sử dụng một chú thích @OneToMany
và @ElementCollection
chú thích vì cả hai đều hoạt động trên mối quan hệ một-nhiều?
Câu trả lời:
Tôi tin @ElementCollection
là chủ yếu để ánh xạ các thực thể (có thể nhúng hoặc cơ bản) trong khi @OneToMany
được sử dụng để ánh xạ các thực thể. Vì vậy, cái nào để sử dụng phụ thuộc vào những gì bạn muốn đạt được.
ElementCollection
là một chú thích JPA tiêu chuẩn, hiện được ưa thích hơn chú thích Hibernate độc quyền CollectionOfElements
.
Nó có nghĩa là bộ sưu tập không phải là một tập hợp các thực thể, mà là một tập hợp các loại đơn giản (Chuỗi, v.v.) hoặc một tập hợp các phần tử có thể nhúng (lớp được chú thích bằng @Embeddable
).
Điều đó cũng có nghĩa là các thành phần được sở hữu hoàn toàn bởi các thực thể chứa: chúng được sửa đổi khi thực thể bị sửa đổi, bị xóa khi thực thể bị xóa, v.v. Chúng không thể có vòng đời của riêng chúng.
@ElementCollection
cho phép bạn đơn giản hóa mã khi bạn muốn thực hiện mối quan hệ một-nhiều với loại đơn giản hoặc nhúng. Chẳng hạn, trong JPA 1.0 khi bạn muốn có mối quan hệ một-nhiều với một danh sách String
s, bạn phải tạo một thực thể đơn giản POJO ( StringWrapper
) chỉ chứa khóa chính và String
câu hỏi:
@OneToMany
private Collection<StringWrapper> strings;
//...
public class StringWrapper {
@Id
private int id;
private String string;
}
Với JPA 2.0, bạn chỉ cần viết:
@ElementCollection
private Collection<String> strings;
Đơn giản hơn phải không? Lưu ý rằng bạn vẫn có thể kiểm soát tên bảng và cột bằng cách sử dụng @CollectionTable
chú thích.
Cơ bản hoặc được nhúng :
Các thực thể @EuityCollection: @OneToMany hoặc @ManyToMany
@EuityCollection:
@OneToMany / @ManyToMany:
ElementCollection có thể ghi đè lên ánh xạ hoặc bảng cho bộ sưu tập của chúng, do đó bạn có thể có nhiều thực thể tham chiếu cùng một lớp Embeddable, nhưng có mỗi lưu trữ các đối tượng phụ thuộc của chúng trong một bảng riêng biệt.