Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do the JPA2 MetaModel get generated with volatile members?

I have just used org.apache.openjpa.persistence.meta.AnnotationProcessor6 to generate the MetaModel for my JPA2 entities.

@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;
}

Can someone please explain why the attributes are marked volatile in this case?

Thanks.

like image 742
planetjones Avatar asked Dec 19 '11 16:12

planetjones


People also ask

How do I generate a JPA metamodel class?

Generating JPA Metamodel Classes Note, we need to add the target/generated-classes folder to the classpath of our IDE, as by default, the classes will be generated in this folder only.

What is metamodel in JPA?

JPA (Java persistence API) metamodel classes are classes that describe the structure of JPA entity classes (classes used to store database state as Java objects). They enable you to write Java code for creating database queries in a typesafe way.

What is a static metamodel?

The static metamodel is useful for creating type-safe queries with the JPA's Criteria API. For example, let's have the following two entities, Order and Item : @Entity public class Order { @Id @GeneratedValue Integer id; @ManyToOne Customer customer; @OneToMany Set<Item> items; BigDecimal totalCost; // accessors }

What is canonical metamodel?

Canonical MetamodelThe annotation processor produces for every managed entity in the persistence unit a metamodel class based on these rules: For each managed class X in package p, a metamodel class X_ in package p is created.


2 Answers

The thread that sets the static variables might not be the same as the thread that you use to access them, so the volatile modifier is required to synchronize memory between all threads.

The scenario without volatile is like this:

  1. Your thread accesses the variables before the JPA provider is initialized and gets null for the static fields
  2. The JPA provider is initialized from a different thread and sets the static fields to non-null values
  3. Your thread accesses the static fields again. In this case the cached memory of your thread will not see the changes and continue to return null for all static fields.
like image 196
Ingo Kegel Avatar answered Nov 07 '22 05:11

Ingo Kegel


Despite the meaning of volatile keyword and Ingo's answer, it's worth noticing that every JPA generator is required to generate volatile metadata fields (JPA 2.0 FR, 6.2.1.1 Canonical Metamodel).

On page 199 you can read:

For every persistent non-collection-valued attribute y declared by class X, where the type of y is Y, the metamodel class must contain a declaration as follows:

public static volatile SingularAttribute<X, Y> y;

like image 24
Piotr Nowicki Avatar answered Nov 07 '22 07:11

Piotr Nowicki