Почему метамодель 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;
}

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

Благодарю.

2 ответа

Решение

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

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

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

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

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

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

public static volatile SingularAttribute<X, Y> у;

Другие вопросы по тегам