Почему метамодель JPA2 генерируется с изменчивыми элементами?

Я только что использовал 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;
}

Может кто-нибудь объяснить, почему в этом случае атрибуты помечены как volatile?

Спасибо.


person planetjones    schedule 19.12.2011    source источник


Ответы (2)


Поток, устанавливающий статические переменные, может не совпадать с потоком, который вы используете для доступа к ним, поэтому для синхронизации памяти между всеми потоками требуется модификатор volatile.

Сценарий без volatile такой:

  1. Ваш поток обращается к переменным до инициализации провайдера JPA и получает null для статических полей.
  2. Поставщик JPA инициализируется из другого потока и устанавливает для статических полей ненулевые значения.
  3. Ваш поток снова обращается к статическим полям. В этом случае кешированная память вашего потока не увидит изменений и продолжит возвращать null для всех статических полей.
person Ingo Kegel    schedule 19.12.2011
comment
Спасибо, Инго - думаю, я схожу с ума, конечно, их нужно инициализировать! В соответствии со спецификацией. Когда создается фабрика диспетчера сущностей для единицы сохраняемости, поставщик сохраняемости несет ответственность за инициализацию состояния классов метамодели единицы сохраняемости. Я видел предупреждения Сонара и не подумал... Принятый ответ - person planetjones; 20.12.2011

Несмотря на значение volatile ключевого слова и ответ Инго, стоит отметить, что каждый генератор JPA < strong>требуется для создания изменяемых полей метаданных (JPA 2.0 FR, 6.2.1.1 Каноническая метамодель).

На странице 199 вы можете прочитать:

Для каждого постоянного атрибута y, не связанного с коллекцией, объявленного классом X, где тип y — Y, класс метамодели должен содержать следующее объявление:

public static volatile SingularAttribute<X, Y> y;

person Piotr Nowicki    schedule 19.12.2011