CHANGES:

javax.persistence:

updated licenses in all files

following additional changes were made:

Cache:
    added     public <T> T unwrap(Class<T> cls);

CacheStoreMode:
    clarified USE semantics

ColumnResultType:
    type element added

EntityExistsException:
    qualification for unsync'd PCs added

EntityManager:
    many javadoc changes due to introduction of unsync'd PCs
    added     public Query createQuery(CriteriaUpdate updateQuery);
    added     public Query createQuery(CriteriaDelete deleteQuery);
    improved  docs for public Query createNativeQuery(String sqlString);
    added     public StoredProcedureQuery createNamedStoredProcedureQuery(String name);
    added     public StoredProcedureQuery createStoredProcedureQuery(String procedureName);
    added     public StoredProcedureQuery createStoredProcedureQuery(String procedureName, String... resultSetMappings);
    added     public boolean isJoinedToTransaction();

EntityManagerFactory:
    added     public void addNamedQuery(String name, Query query);
    added    public <T> T unwrap(Class<T> cls);

EntityNotFoundException:
    qualification for unsync'd PCs added

FieldResult
    improvement to documentation

FlushModeType:
    qualifications for unsync'd PCs added

NamedQuery:
    qualifications for unsync'd PCs added

PersistenceContext:
    added  synchronization element

PersistenceException:
    qualifications for unsync'd PCs added

Query:
    clarifications to getParameterValue methods (for OUT params)
    clarification to getLockMode
    qualifications for unsync'd PCs

SqlResultSetMapping
    added ConstructorResult

TypedQuery:
    qualifications for unsync'd PCs


Added Files:

      ConstructorResult
      NamedStoredProcedureQuery
      NamedStoredProcedureQueries
      StoredProcedureParameter
      ParameterMode
      StoredProcedureQuery
      SynchronizationType


javax.persistence.metamodel:
    updated licenses in all files

javax.persistence.spi:
    updated licenses in all files

javax.persistence.criteria:
    updated licenses in all files

AbstractQuery:
    refactored to inherit from CommonAbstractQuery

CollectionJoin:
    added    CollectionJoin<Z, E> on(Expression<Boolean> restriction);
    added    CollectionJoin<Z, E> on(Predicate... restrictions);

CriteriaBuilder:
    added     <T> CriteriaUpdate<T> createCriteriaUpdate(Class<T> targetEntity);
    added     <T> CriteriaDelete<T> createCriteriaDelete(Class<T> targetEntity);
    added     <X, T, V extends T> Join<X, V> treat(Join<X, T> join, Class<V> type);
    added     <X, T, E extends T> CollectionJoin<X, E> treat(CollectionJoin<X, T> join, Class<E> type);
    added    <X, T, E extends T> SetJoin<X, E> treat(SetJoin<X, T> join, Class<E> type);
    added    <X, T, E extends T> ListJoin<X, E> treat(ListJoin<X, T> join, Class<E> type);
    added    <X, K, T, V extends T> MapJoin<X, K, V> treat(MapJoin<X, K, T> join, Class<V> type);
    added    <X, T extends X> Path<T> treat(Path<X> path, Class<T> type);
    added    <X, T extends X> Root<T> treat(Root<X> root, Class<T> type);

Fetch:
    added     Fetch<Z, X> on(Expression<Boolean> restriction);
    added     Fetch<Z, X> on(Predicate... restrictions);
    added     Predicate getOn();

Join:
    added    Join<Z, X> on(Expression<Boolean> restriction);
    added    Join<Z, X> on(Predicate... restrictions);
    added    Predicate getOn();

ListJoin:
    added     ListJoin<Z, E> on(Expression<Boolean> restriction);
    added     ListJoin<Z, E> on(Predicate... restrictions);

MapJoin:
    added    MapJoin<Z, K, V> on(Expression<Boolean> restriction);
    added    MapJoin<Z, K, V> on(Predicate... restrictions);

SetJoin:
    added    SetJoin<Z, E> on(Expression<Boolean> restriction);
    added    SetJoin<Z, E> on(Predicate... restrictions);

Added Files
      CommonAbstractQuery
      CriteriaUpdate
      CriteriaDelete


Not yet updated:
XSDs




