Hibernate.orgCommunity Documentation
JPA 2 defines a new typesafe Criteria API which allows criteria
        queries to be constructed in a strongly-typed manner, using metamodel objects to provide
        type safety. For developers it is important that the task of the metamodel generation can be
        automated. Hibernate Static Metamodel Generator is an annotation processor based on the
        [Pluggable Annotation Processing API] with the task of creating JPA 2 static metamodel classes. The following example
        show two JPA 2 entities Order and Item,
        together with the metamodel class Order_ and a typesafe query.
Example 1.1. JPA 2 annotated entities Order and
          Item
@Entity
public class Order {
@Id
@GeneratedValue
Integer id;
@ManyToOne
Customer customer;
@OneToMany
Set<Item> items;
BigDecimal totalCost;
// standard setter/getter methods
...
}
@Entity
public class Item {
@Id
@GeneratedValue
Integer id;
int quantity;
@ManyToOne
Order order;
// standard setter/getter methods
...
}
Example 1.2. Metamodel class  Order_
@StaticMetamodel(Order.class)
public class Order_ {
public static volatile SingularAttribute<Order, Integer> id;
public static volatile SingularAttribute<Order, Customer> customer;
public static volatile SetAttribute<Order, Item> items;
public static volatile SingularAttribute<Order, BigDecimal> totalCost;
}
Example 1.3. Typesafe citeria query
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items);
cq.where( cb.equal(itemNode.get(Item_.id), 5 ) ).distinct(true);
The structure of the metamodel classes is described in the [JPA 2 Specification], but for completeness the definition is repeated in the following paragraphs. Feel free to skip ahead to Chapter 2, Usage if you are not interested into the gory details.
The annotation processor produces for every managed class 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.
The name of the metamodel class is derived from the name of the managed class by appending "_" to the name of the managed class.
The metamodel class X_ must be annotated with the
                javax.persistence.StaticMetamodel annotation.
If class X extends another class S,
              where S is the most derived managed class (i.e., entity or
              mapped superclass) extended by X, then class
                X_ must extend class S_, where
                S_ is the metamodel class created for
                S.
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;
For every persistent collection-valued attribute z declared by class
                X, where the element type of z is Z,
              the metamodel class must contain a declaration as follows:
if the collection type of z is java.util.Collection, then
public static volatile CollectionAttribute<X, Z> z;
if the collection type of z is java.util.Set, then
public static volatile SetAttribute<X, Z> z;
if the collection type of z is java.util.List, then
public static volatile ListAttribute<X, Z> z;
if the collection type of z is java.util.Map, then
public static volatile MapAttribute<X, K, Z> z;
where K is the type of the key of the map in class X
Import statements must be included for the needed
          javax.persistence.metamodel types as appropriate and all classes
          X, Y, Z, and
          K.
Copyright © 2010 Red Hat Inc.