2010-10-26 28 views
24

điều gì tốt hơn cho các khóa chính kết hợp JPA/Hibernate, triển khai @IdClass hoặc @EmbeddedId và tại sao?JPA/Hibernate: Điều gì tốt hơn cho các khóa chính kết hợp, triển khai @IdClass hoặc @EmbeddedId và tại sao?

Đây là câu hỏi có chủ ý ngây thơ. Tôi quyết định sử dụng @EmbeddedId (vì bất kỳ lý do gì) và tôi cảm thấy mình đã chọn sai. Dereferencing nhúngId có chứa các thuộc tính cột là dư thừa và khá dễ bị lỗi khi mã hóa.

Có thêm lý do và/hoặc lý do nào khác không? Là một khuyến nghị của JPA (spec)?

+0

bản sao có thể có của [Tôi nên sử dụng ký hiệu nào: @IdClass hoặc @EmbeddedId] (http://stackoverflow.com/questions/212350/which-anotation-should-i-use-idclass-or-embeddedid) –

+0

Nó dường như. Nhưng nó không liệt kê nhiều lý do hơn. – Kawu

+0

Hướng dẫn Hibernate tư vấn chống lại @IdClass vì các lý do không xác định: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e1112 Có thể ai đó có thể xóa nội dung này? – Kawu

Trả lời

7

Như Pascal đã viết đây là một phần của câu trả lời:

Which annotation should I use: @IdClass or @EmbeddedId

Cuối cùng, tôi tin rằng sử dụng @IdClass là dễ dàng hơn nhiều trong thực tế, bởi vì bạn phải thêm tên embeddedId tài sản để tính dereference PK, trong khi chúng không được viết cho tất cả các thuộc tính không phải PK.

Bạn luôn phải nhớ chính xác thuộc tính nào là một phần của PK và những thuộc tính không phải là PK. Điều đó làm phức tạp việc viết các truy vấn JPQL không cần thiết.

Ngoài ra, AFAIK JPA 2.0 đặc tả cho phép bạn đặt @Id vào @XToX/@JoinColumn/s thuộc tính và nó giới thiệu các @MapsId chú thích, để lập bản đồ xác định các mối quan hệ (định danh còn được gọi là có nguồn gốc tại JPA) là tự nhiên hơn để thực hiện.

2

I. Hãy nhớ sử dụng idclass để làm điều đó. Nhưng tôi khuyên bạn nên làm tất cả mọi thứ bạn có thể để tránh các khóa đa lĩnh vực. Họ chỉ tạo thêm công việc.

+0

Gave +1 'vì nó đã làm cho chúng tôi đánh giá lại bằng cách sử dụng tổng hợp PK và đã đi đến kết luận chúng tôi muốn được tốt hơn off w/o chúng. – Erikson

+0

Đôi khi - đặc biệt khi làm việc với lược đồ cũ - cách duy nhất để ánh xạ chính xác thực thể là sử dụng các PK hỗn hợp. Tất nhiên khi thiết kế một lược đồ mới tốt hơn là tránh chúng (nếu có thể). – snorbi

8

Trước tiên, nếu có thể, hãy tránh id tổng hợp bằng mọi giá. Nhưng nếu bạn thực sự cần, tôi sẽ giới thiệu @EmbeddedId.

@IdClass về cơ bản là còn sót lại từ EJB 2,1 lần để dễ dàng di chuyển từ BMP hơn. Trong một số trường hợp góc hiếm khác, nó có thể tốt hơn so với @EmbeddedId. Tuy nhiên, nói chung là @EmbeddedId là tốt hơn và nhiều OO vì nó đóng gói các khái niệm os chìa khóa tốt hơn nhiều trong đối tượng.

Bạn có thể muốn sử dụng @AttributeOverride(s) nếu bạn cần trong trường khóa.

Tôi không hiểu tại sao bạn nghĩ rằng dereferencing id được nhúng là dư thừa và dễ bị lỗi.

+0

Có, bạn nói đúng với câu cuối cùng của bạn. Nếu người dùng sử dụng cú pháp JPA 2.0, sẽ không có bất kỳ trường dư thừa nào trên lớp thực thể, vì vậy bạn phải luôn luôn dereference các cột kết nối, mà dường như thích hợp hơn cho tất cả 4 key vatiants JPA 1.0 @IdClass, JPA 1.0 @EmbeddedId, JPA 2.0 @IdClass và JPA 2.0 @EmbeddedId. – Kawu

+1

Bạn có thể giải thích tại sao ID kết hợp không hợp lệ? – displayname

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