2010-01-28 49 views

Trả lời

315

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.

+1

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? –

+1

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

+18

Đ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

96

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ó.

71

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 genderid 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()setFemale() và do đó sẽ không còn tồn tại Person.

+0

@psp bạn có thể giải thích thêm tại sao/cách nó có thể gây ra hành vi không xác định? Cảm ơn! – 40Plot

+0

@ 40Plot các đặc điểm kỹ thuật tiểu bang để – psp

+4

Điều này nên được IMHO câu trả lời được chấp nhận vì nó là nhiều hơn nữa giải thích rằng hiện tại chấp nhận một ... –

11

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@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.

+0

bạn có thể vui lòng cung cấp ví dụ để làm cho nó rõ ràng hơn? –

0

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.

26

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.

+0

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'. –

+1

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"). " –

+0

Giải thích rất tốt! – GOXR3PLUS

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