Apache OpenJPA 2.2.1
Licensed under Apache License 2.0 - http://www.apache.org/licenses/LICENSE-2.0
--------------------------------------------------------------------------------

Content
-------
   * Overview
   * License
   * Notices
   * Prerequisites
   * Documentation
   * Getting Involved
   * Included Changes
     * Sub-tasks
     * Bugs
     * Improvements
     * New Features
     * Test


Overview
--------
   The Apache OpenJPA community is proud to release a maintenance distribution of
   OpenJPA 2.2.1. This distribution is based on the final JSR 317 Java 
   Persistence API, Version 2.0 specification and passes the JPA 2.0 TCK,
   while remaining backwards compatible with prior releases based on the
   Java Persistence API (JPA 1.0) part of Java Community Process JSR-220
   (Enterprise JavaBeans 3.0).
   
   Additional information on the OpenJPA project may be found at the project
   web site:
      http://openjpa.apache.org


License
-------
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements. See the NOTICE file distributed with this
   work for additional information regarding copyright ownership. The ASF
   licenses this file to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance with the
   License. You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
   License for the specific language governing permissions and limitations
   under the License.

   The license may also be found in LICENSE.txt included in each assembly.


Notices
-------
   Copyright 2006,2012 The Apache Software Foundation.
   Apache, the Apache feather logo and OpenJPA are trademarks of
   The Apache Software Foundation.

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   OpenJPA includes the persistence and orm schemas from the JPA specifications.
   Copyright 2005-2009 Sun Microsystems, Inc. All rights reserved.
   OpenJPA elects to include this software in this distribution under the
   CDDL license.  You can obtain a copy of the License at:
       https://glassfish.dev.java.net/public/CDDL+GPL.html
   The source code is available at:
       http://java.net/projects/glassfish

   The complete list of notices can be found in NOTICE.txt included in each
   assembly.


Prerequisites
-------------
   OpenJPA requires Java SE 6 or higher and a relational 
   database of some sort.


Documentation
-------------
   If you have questions about OpenJPA, a good source of information is the
   online product manual. You can find the manual for the current release as
   well as older releases of OpenJPA at
       http://openjpa.apache.org/documentation.html

   If you can't find what you are looking for in the manual or would like more
   clarification, please post to the OpenJPA development mailing list.
   Information on all of the OpenJPA mailing lists may be found here:
       http://openjpa.apache.org/mailing-lists.html


Getting Involved
----------------
   The Apache OpenJPA project is being built by the open source community for
   the open source community - we welcome your input and contributions!

   What we are looking for
        * Source code and fixes contributions
        * Documentation assistance
        * Product and feature suggestions
        * Detailed and constructive feedback
        * Articles and whitepapers

   How do I contribute?
        * To discuss Apache OpenJPA topics check out the mailing lists.
        * Informal discussion also occurs on the #openjpa IRC channel on
          freenode.net.
        * Bugs and other issues can be posted on the issue tracker at
          https://issues.apache.org/jira/browse/OPENJPA


Included Changes in OpenJPA 2.2.1
---------------------------------

Sub-task

    [OPENJPA-2168] - Do not go through LifeCycleEventManager overhead if the Entity has declared to be excluded

Bug

    [OPENJPA-2067] - A 'length' of '-1' passed to PreparedStatement.setBinaryStream can cause an exception on some, but not all, JDBC drivers.
    [OPENJPA-2072] - InvalidStateException deleting an instance with a timestamp in its primary key
    [OPENJPA-2095] - Unhandled exception thrown from within an Externalizer method causes incorrect/incomplete SQL to be generated/executed.
    [OPENJPA-2118] - Prepared SQL query does not handle collection-valued parameter where collection is empty
    [OPENJPA-2123] - Minor performance improvements for Connection and ResultSet processing
    [OPENJPA-2132] - Traversal of a OneToMany relationship returns an empty list when InheritanceType.JOINED or SINGLE_TABLE is used.
    [OPENJPA-2133] - OpenJPA doesn't find custom mappings with an applicable class loader
    [OPENJPA-2136] - NPE when using LiteAutoDetach
    [OPENJPA-2142] - Merge of a new object does not handle Entity Id field
    [OPENJPA-2145] - Missing ASM depending jar in binary zip
    [OPENJPA-2146] - StateManager for Embeddable may throw Exception while initializing
    [OPENJPA-2149] - Criteria.function adds wrong casts to parameters making it unsuable
    [OPENJPA-2153] - NoSuchMethodException of DBCPDriverDataSource.newInstance()
    [OPENJPA-2154] - test-dynamic-enhancer profile failed for module more than one level deep
    [OPENJPA-2156] - Fix bug in org.apache.openjpa.persistence.util.SourceCode to correctly generate imports.
    [OPENJPA-2158] - LiteAutoDetach + DetachProxyFields=false can lead to Broker concurrency exceptions
    [OPENJPA-2161] - Make some members of StateManagerImpl protected to allow for greater extensability
    [OPENJPA-2163] - Lifecycle event callback occurs more often than expect
    [OPENJPA-2172] - openjpa-all jar is missing slf4j runtime dependency
    [OPENJPA-2174] - Result set mapping was not looked up when retrieving column data from a NamedNativeQuery
    [OPENJPA-2199] - Constraint violation exception when removing relationship using (orphanRemoval = true)
    [OPENJPA-2227] - OpenJPA doesn't find custom SequenceGenerators
    [OPENJPA-2230] - Event Listener detection didn't work with MappedSuperClasses or Entity heirarchies
    [OPENJPA-2236] - Trace of connection info can cause class transform/enhancement to fail
    [OPENJPA-2247] - JoinColumn annotation is ignored when mapping a unidirectional owned OneToOne that is in a SecondaryTable
    [OPENJPA-2260] - Parenthesis-augmented parameters are improperly processed at EM level
    [OPENJPA-2261] - Query SQL Cache issue with NULL parameters

Improvement

    [OPENJPA-2134] - Do not close Connections when ConnectionRetainMode is set to "always"
    [OPENJPA-2137] - Make some members of StateManagerImpl protected to allow for greater extensibility
    [OPENJPA-2143] - Reduce lock contention on LifecycleEventManager
    [OPENJPA-2151] - Improve the performance of StateManagerImpl.initialize
    [OPENJPA-2152] - Don't process query hints when LockModeType == NONE
    [OPENJPA-2159] - Add support for no rounding of Date
    [OPENJPA-2162] - Avoid delimited identifier processing if it's not required by application
    [OPENJPA-2164] - Don't setPCState if field requested is already loaded
    [OPENJPA-2167] - Misc changes to improve flush() path performance
    [OPENJPA-2189] - Update OpenBooks example to build, install, and execute in the WAS Liberty Profile
    [OPENJPA-2208] - Add additional Java 2 Security doPriv function

Test

    [OPENJPA-2169] - TestOracleXmlColumn test failed using Oracle 11.2 driver
