Java có từ khóa transient
. Tại sao JPA lại có @Transient
thay vì chỉ sử dụng từ khóa java đã tồn tại?Tại sao JPA có chú thích @Transient?
Trả lời
Từ khóa transient
của Java được sử dụng để biểu thị trường không được sắp xếp theo thứ tự, trong khi chú thích @Transient
của JPA được sử dụng để biểu thị trường không được lưu giữ trong cơ sở dữ liệu, nghĩa là ngữ nghĩa của chúng khác nhau.
Vì chúng có ý nghĩa khác nhau. Chú thích @Transient
yêu cầu nhà cung cấp JPA không tồn tại bất kỳ thuộc tính nào (không phải là transient
). Người kia nói với khung tuần tự hóa để không serialize một thuộc tính. Bạn có thể muốn có một thuộc tính @Transient
và vẫn đang tuần tự hóa nó.
Như những người khác đã nói, @Transient
được sử dụng để đánh dấu các trường không nên tiếp tục tồn tại. Hãy xem xét ví dụ ngắn này:
public enum Gender { MALE, FEMALE, UNKNOWN }
@Entity
public Person {
private Gender g;
private long id;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public Gender getGender() { return g; }
public void setGender(Gender g) { this.g = g; }
@Transient
public boolean isMale() {
return Gender.MALE.equals(g);
}
@Transient
public boolean isFemale() {
return Gender.FEMALE.equals(g);
}
}
Khi lớp này được đưa vào JPA, nó vẫn tồn tại các gender
và id
nhưng không cố gắng để tồn tại các helper boolean phương pháp - mà không @Transient
hệ thống cơ bản sẽ phàn nàn rằng các lớp Entity Person
thiếu phương thức setMale()
và setFemale()
và do đó sẽ không còn tồn tại Person
.
Nếu bạn chỉ muốn một trường không được duy trì, cả hai công việc thoáng qua và @Transient đều hoạt động. Nhưng câu hỏi là tại sao @Transient kể từ thoáng qua đã tồn tại.
Vì @Transient field vẫn sẽ được đăng theo thứ tự!
Giả sử bạn tạo một thực thể, thực hiện một số phép tính tiêu thụ CPU để có kết quả và kết quả này sẽ không lưu trong cơ sở dữ liệu. Nhưng bạn muốn gửi thực thể đến các ứng dụng Java khác để sử dụng bởi JMS, thì bạn nên sử dụng @Transient
, không phải từ khóa JavaSE transient
. Vì vậy, các máy thu chạy trên các máy ảo khác có thể tiết kiệm thời gian của họ để tính toán lại.
bạn có thể vui lòng cung cấp ví dụ để làm cho nó rõ ràng hơn? –
Tôi sẽ cố gắng trả lời câu hỏi "lý do". Hãy tưởng tượng một tình huống mà bạn có một cơ sở dữ liệu khổng lồ với nhiều cột trong một bảng và dự án/hệ thống của bạn sử dụng các công cụ để tạo ra các thực thể từ cơ sở dữ liệu. (Hibernate có những, vv ...) Bây giờ, giả sử rằng bởi logic nghiệp vụ của bạn, bạn cần một trường cụ thể KHÔNG được duy trì. Bạn phải "cấu hình" thực thể của bạn theo một cách cụ thể. Trong khi từ khóa thoáng qua hoạt động trên một đối tượng - vì nó hoạt động trong một ngôn ngữ java, @Transient chỉ được thiết kế để trả lời các tác vụ liên quan đến các tác vụ liên tục.
Mục đích là khác nhau:
Các transient
từ khóa và @Transient
chú thích có hai mục đích khác nhau: một thỏa thuận với serialization và một thỏa thuận với kiên trì. Là lập trình viên, chúng tôi thường kết hôn hai khái niệm này thành một, nhưng điều này không chính xác nói chung. Persistence đề cập đến đặc điểm của trạng thái làm nổi bật quá trình tạo ra nó.Serialization trong Java đề cập đến quá trình mã hóa/giải mã trạng thái của đối tượng dưới dạng luồng byte.
Từ khóa transient
là một điều kiện mạnh hơn @Transient
:
Nếu một lĩnh vực sử dụng từ khóa transient
, lĩnh vực đó sẽ không được tuần tự khi đối tượng được chuyển đổi sang một dòng byte. Hơn nữa, vì JPA xử lý các trường được đánh dấu bằng từ khóa transient
vì có chú thích @Transient
, trường này cũng sẽ không được JPA lưu giữ.
Mặt khác, các trường được chú thích @Transient
một mình sẽ được chuyển thành luồng byte khi đối tượng được tuần tự hóa, nhưng JPA sẽ không lưu lại. Do đó, từ khóa transient
là điều kiện mạnh hơn so với chú thích @Transient
.
Ví dụ
này đặt ra câu hỏi: Tại sao mọi người lại muốn serialize một lĩnh vực mà không phải là vẫn kiên trì cơ sở dữ liệu của ứng dụng? Thực tế là tuần tự hóa được sử dụng không chỉ là sự kiên trì. Trong một ứng dụng Java Enterprise, cần phải có một cơ chế để trao đổi các đối tượng giữa các thành phần được phân phối; serialization cung cấp một giao thức truyền thông chung để xử lý việc này. Do đó, một trường có thể chứa thông tin quan trọng cho mục đích giao tiếp giữa các thành phần; nhưng cùng một trường có thể không có giá trị từ một quan điểm kiên trì.
Ví dụ: giả sử thuật toán tối ưu hóa được chạy trên máy chủ và giả sử thuật toán này mất vài giờ để hoàn thành. Với một khách hàng, việc có các giải pháp cập nhật mới nhất là quan trọng. Vì vậy, một khách hàng có thể đăng ký với máy chủ và nhận các cập nhật định kỳ trong giai đoạn thực hiện thuật toán. Những thông tin cập nhật được cung cấp bằng cách sử dụng đối tượng ProgressReport
:
@Entity
public class ProgressReport implements Serializable{
private static final long serialVersionUID = 1L;
@Transient
long estimatedMinutesRemaining;
String statusMessage;
Solution currentBestSolution;
}
Lớp Solution
có thể trông như thế này:
@Entity
public class Solution implements Serializable{
private static final long serialVersionUID = 1L;
double[][] dataArray;
Properties properties;
}
Các máy chủ vẫn còn mỗi ProgressReport
đến cơ sở dữ liệu của nó. Máy chủ không quan tâm đến việc tồn tại estimatedMinutesRemaining
, nhưng khách hàng chắc chắn quan tâm đến thông tin này. Do đó, estimatedMinutesRemaining
được chú thích bằng cách sử dụng @Transient
. Khi số Solution
cuối cùng được định vị theo thuật toán, nó được JPA tiếp tục trực tiếp mà không cần sử dụng ProgressReport
.
Nếu họ thực sự là những mối quan tâm khác nhau, chắc chắn có tồn tại một từ khác nhau mà nắm bắt các sắc thái. Tại sao quá tải hạn? Là đề xuất khởi đầu, '@ Unpersisted'. –
Cá nhân tôi thích '@ Ephemeral'. Theo Merriam Webster: Khi lần đầu tiên được in bằng tiếng Anh vào những năm 1600, “đó là một thuật ngữ khoa học được áp dụng cho các cơn sốt ngắn hạn, và sau đó, với các sinh vật (như côn trùng và hoa) với tuổi thọ rất ngắn. , nó có được một cảm giác mở rộng đề cập đến bất cứ điều gì thoáng qua và ngắn ngủi (như trong "thú vui bất tận"). " –
Giải thích rất tốt! – GOXR3PLUS
Vâng, ngữ nghĩa là khác nhau. Nhưng tại sao JPA lại được thiết kế theo cách này? –
Không chắc chắn tôi hiểu bạn, nhưng hãy xem câu trả lời "Pascal Thivent";) – Jawher
Điều này rất tiện lợi vì bạn có thể không muốn lưu trữ dữ liệu trong cơ sở dữ liệu, nhưng bạn muốn lưu trữ nó trong JPA Chaching hệ thống sử dụng serialization cho các cửa hàng/phục hồi của các thực thể. – Kdeveloper