2011-12-19 7 views
6

JPA2エンティティのMetaModelを生成するのにちょうどorg.apache.openjpa.persistence.meta.AnnotationProcessor6を使用しました。JPA2メタモデルが揮発性メンバーで生成されるのはなぜですか?

@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; 
} 

この場合、属性が揮発性とマークされている理由を説明してもらえますか?

ありがとうございました。

答えて

7

静的変数を設定するスレッドは、アクセスに使用するスレッドと同じではない可能性があるため、すべてのスレッド間でメモリを同期させるにはvolatile修飾子が必要です。

volatileなしのシナリオは、このようなものです:

  1. あなたのスレッドは、JPAプロバイダが初期化される前に、変数にアクセスし、JPAプロバイダが別のスレッドやセットから初期化される静的フィールド
  2. ためnull取得staticフィールドからnull以外の値へ
  3. スレッドは静的フィールドに再度アクセスします。この場合、スレッドのキャッシュメモリは変更を認識せず、すべての静的フィールドに対してnullを返し続けます。 meaning of volatile keywordとインゴの答えにもかかわらず
+0

ありがとうございますIngo - 私は怒っていると思いますが、もちろん初期化する必要があります!スペックに従い、「持続性ユニットのためのエンティティマネージャファクトリが作成されるとき、持続性ユニットのメタモデルクラスの状態を初期化するのは、持続性プロバイダの責任である」。私はソナーの警告を見て、思っていなかった... – planetjones

2

、それはすべてのJPAジェネレータがにを必要としていることに気付い価値がある揮発性のメタデータフィールド(JPA 2.0 FR、6.2.1.1 Canonicalのメタモデル)を生成します。 199ページ

あなたが読むことができます。yの型がYである クラスX、によって宣言されているすべての永続的な非コレクション値属性yの

を、メタモデルクラスは、として 宣言を含まなければなりません以下:

public static volatile SingularAttribute<X, Y> y;

関連する問題