繁体   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