2011-12-19 33 views
6

Tôi vừa mới sử dụng org.apache.openjpa.persistence.meta.AnnotationProcessor6 để tạo MetaModel cho các thực thể JPA2 của mình.Tại sao MetaModel JPA2 lại được tạo ra với các thành viên dễ bay hơi?

@javax.annotation.Generated 
(value="org.apache.openjpa.persistence.meta.AnnotationProcessor6", 
    date="Tue Nov 22 09:49:03 CET 2011") 
public class Entity_ { 
    public static volatile SingularAttribute<Entity,Entity> id; 
    public static volatile SingularAttribute<Entity,String> value; 
    public static volatile SingularAttribute<Entity,String> order; 
} 

Ai đó có thể giải thích tại sao các thuộc tính được đánh dấu dễ bay hơi trong trường hợp này?

Cảm ơn.

Trả lời

7

Chủ đề đặt biến tĩnh có thể không giống với chuỗi mà bạn sử dụng để truy cập chúng, do đó cần sửa đổi volatile để đồng bộ hóa bộ nhớ giữa tất cả các chuỗi.

Kịch bản mà không volatile là như thế này:

  1. chủ đề của bạn truy cập vào các biến trước khi các nhà cung cấp JPA được khởi tạo và được null cho các lĩnh vực tĩnh
  2. Nhà cung cấp JPA được khởi tạo từ một sợi và bộ khác nhau các trường tĩnh thành giá trị không null
  3. Chuỗi của bạn sẽ truy cập lại vào các trường tĩnh. Trong trường hợp này bộ nhớ đệm của chuỗi của bạn sẽ không thấy thay đổi và tiếp tục trả về null cho tất cả các trường tĩnh.
+0

Cảm ơn Ingo - nghĩ rằng tôi sẽ phát điên, tất nhiên họ cần phải được khởi tạo! Theo thông số kỹ thuật "Khi nhà máy quản lý thực thể cho một đơn vị bền vững được tạo ra, đó là trách nhiệm của nhà cung cấp kiên trì để khởi tạo trạng thái của các lớp siêu mô hình của đơn vị bền vững." Tôi đã nhìn thấy những lời cảnh báo của Sonar và không nghĩ qua ... – planetjones

2

Mặc dù meaning of volatile keyword và câu trả lời của Ingo, nó có giá trị nhận thấy rằng tất cả các máy phát điện JPA là cần thiết để tạo ra lĩnh vực dễ bay hơi siêu dữ liệu (JPA 2,0 FR, 6.2.1.1 Canonical metamodel).

Trên trang 199 bạn có thể đọc:

Đối với mỗi y thuộc tính không thu có giá trị dai dẳng tuyên bố bởi lớp X, nơi mà các loại y là Y, lớp metamodel phải chứa một tuyên bố như sau:

public static volatile SingularAttribute<X, Y> y;

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