Почему метамодель JPA2 генерируется с изменчивыми членами? - PullRequest
7 голосов
/ 19 декабря 2011

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

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

Спасибо.

Ответы [ 2 ]

7 голосов
/ 19 декабря 2011

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

Сценарий без volatile выглядит следующим образом:

  1. Ваш поток обращается к переменным до инициализации поставщика JPA и получает null для статических полей
  2. Поставщик JPA инициализируется из другого потока и устанавливает для статических полей ненулевые значения
  3. Ваш поток снова обращается к статическим полям. В этом случае кэшированная память вашего потока не увидит изменений и продолжит возвращать null для всех статических полей.
2 голосов
/ 19 декабря 2011

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

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

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

public static volatile SingularAttribute<X, Y> y;

...