簡體   English   中英

為什么使用可變成員生成JPA2 MetaModel?

[英]Why do the JPA2 MetaModel get generated with volatile members?

我剛剛使用org.apache.openjpa.persistence.meta.AnnotationProcessor6為我的JPA2實體生成MetaModel。

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

有人可以解釋為什么在這種情況下將屬性標記為易失性嗎?

謝謝。

設置靜態變量的線程可能與用於訪問它們的線程不同,因此需要volatile修飾符才能在所有線程之間同步內存。

沒有volatile的場景是這樣的:

  1. 您的線程在初始化JPA提供程序之前訪問變量,並且對於靜態字段獲取null
  2. JPA提供程序是從其他線程初始化的,並將靜態字段設置為非空值
  3. 您的線程再次訪問靜態字段。 在這種情況下,線程的緩存內存將看不到更改,並繼續為所有靜態字段返回null

盡管volatile關鍵字含義和Ingo的回答,但值得注意的是,每個JPA生成器都需要生成易失的元數據字段(JPA 2.0 FR, 6.2.1.1 Canonical Metamodel )。

在第199頁,您可以閱讀:

對於類X聲明的每個持久性非集合值屬性y(其中y的類型為Y),元模型類必須包含如下聲明:

public static volatile SingularAttribute<X, Y> y;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM