Sự khác biệt giữa @OneToMany và @EuityCollection?


128

Sự khác biệt giữa việc sử dụng một chú thích @OneToMany@ElementCollectionchú thích vì cả hai đều hoạt động trên mối quan hệ một-nhiều?


3
Tóm lại, @EuityCollection được sử dụng khi sự tồn tại của thực thể con là vô nghĩa nếu không có thực thể cha mẹ, IOW, bất cứ khi nào một thực thể cha mẹ bị xóa, con cái của bạn cũng sẽ ...
dellasavia

1
Tôi tin rằng nó KHÔNG phải là Thực thể con, nó là Loại Giá trị / Đối tượng Giá trị được nhúng và sự tồn tại của nó có ý nghĩa ít hơn nếu không có Thực thể chính chứa nó.
CuriousMind 22/12/17

đồng ý với @CantlyMind, trong JPA, một 'Thực thể' có vòng đời riêng.
mhrsalehi

Câu trả lời:


124

Tôi tin @ElementCollectionlà 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.


1
Cảm ơn Peder đã trả lời! Bạn đã có một điểm hợp lệ ở đó vì @OneToMany chỉ có thể liên quan đến các thực thể.
n_g

157

ElementCollectionlà 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.


... Và bạn không thể tự mình truy vấn chúng.
Bị kẹt

65

@ElementCollectioncho 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 Strings, bạn phải tạo một thực thể đơn giản POJO ( StringWrapper) chỉ chứa khóa chính và Stringcâ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 @CollectionTablechú thích.

Xem thêm:


Giải thích tuyệt vời cho lý luận. :)
Phuah Yee Keat

4

Cơ bản hoặc được nhúng :
Các thực thể @EuityCollection: @OneToMany hoặc @ManyToMany

@EuityCollection:

  • mối quan hệ được quản lý (chỉ) bởi thực thể trong đó mối quan hệ được xác định
  • bảng chứa tham chiếu id đến thực thể sở hữu cộng với các thuộc tính cơ bản hoặc được nhúng

@OneToMany / @ManyToMany:

  • cũng có thể được quản lý bởi các thực thể khác
  • bảng tham gia hoặc (các) cột thường chỉ chứa các tham chiếu id

1

@ElementCollectionđánh dấu một bộ sưu tập. Điều này không nhất thiết có nghĩa là bộ sưu tập này tham chiếu tham gia 1-n.


1
Vậy chính xác mục đích của @EuityCollection là gì?
n_g

0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.