2010-12-13 17 views
25

Tôi hiện đang đến (trở lại) lên đến tốc độ với EJB và trong khi tôi đã đi nó thay đổi mạnh (cho đến nay cho tốt hơn). Tuy nhiên, tôi đã đi qua một khái niệm mà tôi đang đấu tranh và muốn hiểu rõ hơn vì nó dường như được sử dụng trong (tôi làm việc, không phải tôi và tất cả những tiếng nói trong đầu) code khá một chút.@AttributeOverride có nghĩa là gì?

Đây là ví dụ tôi đã tìm thấy trong một cuốn sách. Đó là một phần của một ví dụ cho thấy làm thế nào để sử dụng @EmbeddedId chú thích:

@Entity 
public class Employee implements java.io.Serializable 
{ 
    @EmbeddedId 
    @AttributeOverrides({ 
     @AttributeOverride(name="lastName", [email protected](name="LAST_NAME"), 
     @AttributeOverride(name="ssn", [email protected](name="SSN")) 
    }) 

    private EmbeddedEmployeePK pk; 

    ... 
} 

Lớp EmbeddedEmployeePK là một @Embeddable lớp khá đơn giản định nghĩa một cặp @Columns: lastNamessn.

Ồ, và tôi đã lấy ví dụ này từ Enterprise JavaBeans của O'Reilly 3.1 bởi Rubinger & Burke.

Cảm ơn trước vì bất kỳ trợ giúp nào bạn có thể cho tôi.

Trả lời

33

Điều này nói rằng các thuộc tính tạo nên id được nhúng có thể đã được xác định trước (thông qua các tên cột ánh xạ rõ ràng hoặc ngầm). Bằng cách sử dụng các @AttributeOverride bạn đang nói "bỏ qua những thông tin khác bạn có liên quan đến những gì cột nó được lưu trữ trong, và sử dụng một trong tôi chỉ định ở đây".

+0

Ok, tuyệt vời, điều đó có ý nghĩa hơn nhiều so với những gì tác giả đưa vào sách. cảm ơn nhiều! – jaydel

+0

câu trả lời thú vị và hợp lý –

8

Lớp EmbeddedEmployeePK là một lớp @Embeddable khá đơn giản xác định cặp @Columns: lastName và ssn.

Không hẳn - EmbeddedEmployeePK định nghĩa một cặp tính, mà sau đó được ánh xạ vào các cột. Chú thích @AttributeOverride cho phép bạn ghi đè các cột mà thuộc tính của lớp được nhúng được ánh xạ.

Trường hợp sử dụng cho điều này là khi lớp nhúng có thể được sử dụng trong các tình huống khác nhau, nơi tên cột khác nhau và cần có một số cơ chế để bạn thay đổi các ánh xạ cột đó. Ví dụ: giả sử bạn có một thực thể chứa hai trường hợp riêng biệt của cùng một nhúng - chúng không thể vừa ánh xạ tới cùng một tên cột.

0

JPA cố gắng ánh xạ tên trường vào tên cột trong nguồn dữ liệu, vì vậy những gì bạn thấy ở đây là bản dịch giữa tên biến trường thành tên của cột trong cơ sở dữ liệu.

16

AttributeOverride

Trong lớp UserDetails, tôi đã ghi đè homeAddress & officeAddress với Address

0

Bạn có thể ghi đè lên cũng thuộc tính cột khác (không chỉ là tên).
Giả sử bạn muốn thay đổi độ dài của SSN dựa trên việc ai đang nhúng thành phần của bạn. Bạn có thể xác định một @AttributeOverride cho cột như thế này:

@AttributeOverrides({ 
    @AttributeOverride(name = "ssn", column = @Column(name = "SSN", length = 11)) 
}) 
private EmbeddedEmployeePK pk; 

Xem "2.2.2.4. Embedded objects (aka components)" trong tài liệu Hibernate Chú thích.

Để bảo tồn các thuộc tính @Column khác (chẳng hạn như namenullable) hãy giữ chúng trên cột được ghi đè giống như bạn đã chỉ định trên cột ban đầu.