2011-12-28 25 views
5

Giả sử tôi có một thực thể User như thế này:Các thuộc tính có thể ánh xạ trong hbm.xml có bị tạm thời không?

class User { 
    private String login; 
    transient private String hashedPassword; 
} 

Tôi không muốn bao giờ chuyển hashedPassword cho khách hàng, vì vậy tôi làm cho nó thoáng.

Lớp này được ánh xạ bởi Hibernate, với cả hai trường được ánh xạ bằng hbm.xml.

Việc triển khai này có an toàn và chính xác không? Sẽ Hibernate lưu trữ một cách chính xác hashedPassword trong cơ sở dữ liệu, tải nó vào các đối tượng từ cơ sở dữ liệu, giữ nó trong bộ nhớ cache cấp 2 nhân rộng và bộ nhớ cache phiên cục bộ vv?

Theo thứ tự, Hibernate hoặc mức độ bộ nhớ cache cấp 2 tôn trọng transient theo bất kỳ cách nào hoặc hoàn toàn bỏ qua nó?

EDIT: Tôi đã có hai câu trả lời dường như không bao gồm một khía cạnh cụ thể của phương trình. Tôi hoàn toàn không sử dụng chú thích, chỉ ánh xạ XML trong hbm.xml. Và trường Java-thoáng qua này là OR-ánh xạ trong hbm.xml.

Trả lời

3

Dường như Hibernate sẽ không tồn tại một trường có từ khóa transient, bất kể bạn có chú thích nào khác.

Chú thích @Transient riêng biệt sẽ cho phép bạn trực tiếp Hibernate bỏ qua trường không tạm thời để duy trì, nhưng tôi không nghĩ có thể làm ngược lại việc Hibernate tồn tại trường transient.

thảo luận tương tự ở đây:

JPA - using annotations in a model

Annotation @Basic to transient variables

Các trích dẫn phù hợp nhất qua ở trên, từ JPA 2.0 spec: "chú thích bản đồ không được áp dụng cho các lĩnh vực hoặc tài sản có transient hoặc @Transient . "

+0

Cảm ơn bạn, nhưng tôi đã đề cập cụ thể rằng trường được ánh xạ trong hbm.xml. Tôi không kiện các chú thích. –

+0

Hibernate có thực sự ánh xạ thuộc tính trong trường hợp đó không? Tôi đã được giả định rằng các chú thích và hbm.xml hành xử giống nhau, nhưng có lẽ đó không phải là trường hợp. Vì 'transient' sẽ đảm bảo rằng thuộc tính không được tuần tự hóa, câu hỏi của bạn hoàn toàn về hành vi Hibernate? – wrschneider

7

Thuộc tính chưa được ánh xạ/tạm thời không được lưu bởi hibernate.

Hibernate hiểu được tầm quan trọng của các bộ sửa đổi tạm thời java chuẩn - nhưng cũng cho phép bạn chú thích các thuộc tính dưới dạng tạm thời bằng chú thích @Transient, nếu bạn chọn ... Hoặc chỉ cần bỏ trường ra khỏi tệp ánh xạ của bạn.

Trong trường hợp của bạn, bạn có thể sẽ KHÔNG cần phải làm gì đặc biệt, hibernate chỉ đơn giản là "làm điều đúng", bằng cách bỏ qua các trường chưa được ánh xạ.

Vì vậy: bài học học được ở đây -

Nếu chỉ sử dụng hbm.xml

1) tính unmapped không được cứu bởi Hibernate - họ là một cách hiệu quả nhất thời.

Nếu sử dụng POJO

2) Hibernate sẽ bỏ qua tiết kiệm biến "@Transient" chú thích:

@Transient 
int ignored=0; 

3) Hibernate cũng sẽ bỏ qua các biến tiết kiệm với tiêu chuẩn bổ "thoáng":

private transient int ignored =0; 

Xem http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ để có giải thích tuyệt vời về điều này.

+0

Cảm ơn bạn, nhưng tôi đã đề cập cụ thể rằng trường được ánh xạ trong hbm.xml. Tôi không kiện các chú thích. –

+0

Đúng vậy, chú thích POJO không liên quan. Tôi đã thêm một viên đạn để giải quyết câu hỏi của bạn. Trong mọi trường hợp - đơn giản của nó, chỉ cần để biến trên bản đồ của bạn - và ngủ đông sẽ nhìn theo cách khác. Không lưu hoặc lưu bộ nhớ đệm sẽ được thực hiện, bởi vì "bản đồ" của đối tượng của bạn sẽ không bao gồm biến chưa được ánh xạ. – jayunit100

+0

Cảm ơn jay, nhưng quan điểm của tôi hoàn toàn ngược lại. Tôi hỏi liệu nó luôn an toàn, bộ nhớ cache lv thứ hai và không có điều gì, để có một trường POJO thoáng qua được ánh xạ với hbm.xml. –

0

Đây là những gì tôi nghĩ - Hibernate chỉ là một công nghệ lập bản đồ. Khi bạn đánh dấu một trường là TRANSIENT, nó sẽ không được java tiếp tục tồn tại. Và kể từ khi nhà nước của nó không phải là persisted lý do tại sao nên hibernate duy trì nó trong bộ nhớ cache L2, vv? vì vậy hibernate sẽ không có vấn đề ngay cả khi bạn ánh xạ trường thoáng qua trong tệp hbm.