Почему метамодель, созданная JPA 2.0, делает поля VOLATILE?

Новая функция для безопасных типов запросов создает метамодель для классов, но почему эти поля не являются окончательными, а не изменчивыми?

public static volatile SingularAttribute<Presentation, String> topic;

person Cosmin Cosmin    schedule 31.05.2012    source источник


Ответы (1)


Поля в классе метамодели не могут быть окончательными, так как должно быть назначено статическое финальное поле:

  1. вместе с декларацией или
  2. в статическом инициализаторе.

Это невозможно сделать, потому что значение, которое должно быть присвоено, неизвестно тому, кто создает класс метамодели. Значения назначаются поставщиком при создании EntityManagerFactory.

Следствием этого является то, что атрибуты должны быть изменчивыми, чтобы другие потоки могли видеть значения, назначенные провайдером.

person Mikko Maunu    schedule 31.05.2012
comment
Я не очень много знаю о volatile. Но почему полям нужно определенное значение? Почему они не могут назначить случайную реализацию SingularAttribute. Например, новый SingularAttributeImpl(); на шаге генерации. Запрос критерия должен знать только тип (IS A SingularAttribute, CollectionAttribute и т. д.) и общие параметры. Это из-за того, как работает внутренность провайдера? - person Cosmin Cosmin; 01.06.2012
comment
Теперь, когда я лучше изучил API для SingularAttribute, я вижу некоторые дополнительные данные, которые будут установлены поставщиком позже. Таким образом, инструмент генерации немного глупее, он не обрабатывает аннотации/xml для предоставления всей необходимой информации. Он делегирует провайдеру сделать это позже (так что в основном это не очень статично: P). Спасибо. - person Cosmin Cosmin; 01.06.2012