                           Release Notes for OpenJPA 1.2.2

        * Overview
        * License
        * Prerequisites
        * Documentation
        * Getting Involved
        * JIRA Issues resolved

Overview

   These notes describe the difference between OpenJPA release 1.2.2 and the
   preceding release: 1.2.1. 

   OpenJPA is a feature-rich implementation of the persistence part of Java
   Community Process JSR-220 (Enterprise JavaBeans 3.0), which is known as
   the Java Persistence API (JPA). OpenJPA can be used as a stand-alone POJO
   persistence layer, or it can be integrated into any EJB3.0 compliant
   container and many lightweight frameworks. This release of OpenJPA is 100%
   compliant with the JPA specification.

   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 which is included in each
   release of OpenJPA.

Prerequisites

   In normal usage, OpenJPA requires Java 5 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're looking for in the manual or would like more
   clarification you 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 project JIRA.

    JIRA Issues Resolved in this release
Sub-task

    * [OPENJPA-1023] - Message files contain windows EOL characters
    * [OPENJPA-1210] - Specify derby timeouts via properties.
Bug

    * [OPENJPA-466] - Primary key constraint violated using (Oracle) sequence to generate ID in multithreaded app
    * [OPENJPA-714] - "Encountered unmanaged object in persistent field" error while merging object tree
    * [OPENJPA-732] - Updates to entities via Lifecycle callback methods
    * [OPENJPA-873] - @MappedSuperClass Cause Null Pointer Exception in Class With IdClass
    * [OPENJPA-896] - Several source files include Windows EoL chars
    * [OPENJPA-1025] - AbstractResultList.subList throws UnsupportedOperationException
    * [OPENJPA-1029] - SQLServerDictionary causes NumberFormatException if MS SQL Server JDBC driver is used
    * [OPENJPA-1061] - Entities extending from a Mapped Superclass that defines the ID fields share the same ObjectID type parameter
    * [OPENJPA-1067] - SetQueryTimeout(x) where x != 0 causes SQLException with DB2 on Z/OS
    * [OPENJPA-1141] - NPE at org.apache.openjpa.jdbc.meta.MappingInfo.mergeJoinColumn(MappingInfo.java:1400)
    * [OPENJPA-1156] - Path length issues on Windows
    * [OPENJPA-1197] - NativeQueries fail with MySQL
    * [OPENJPA-1308] - shouldn't always use CAST with UPPER and LOWER for DB2
    * [OPENJPA-1326] - ReverseMappingTool and SchemaTool failing for Sybase
    * [OPENJPA-1328] - Move cacheable class configuration to ClassMetaData
    * [OPENJPA-1359] - SQLServer driver 2.0 works, but causes exception in SQLServerDictionary on the first connection
    * [OPENJPA-1384] - ClassNotFoundException for custom DBDictionary used by EJB
    * [OPENJPA-1397] - NULL in columns part of an @IdClass composite key leads to "disappearing" (null) returned objects
    * [OPENJPA-1400] - Unable to persist a relationship to a detached Entity
    * [OPENJPA-1421] - Reduce lock contention in JDBCStoreManager
    * [OPENJPA-1441] - NPE when enhancing a Serializable, versioned class
    * [OPENJPA-1457] - Remove Java.net maven repostiory from tck pom.xml

Improvement

    * [OPENJPA-250] - Reduce synchronization bottlenecks in data cache, metadata repository, and lifecycle event manager
    * [OPENJPA-975] - Oracle needs ability to not have an escape character for search strings.
    * [OPENJPA-991] - Implement LockTimeout using db specific server-side lock timeout feature
    * [OPENJPA-1045] - Add opt-in and opt-out configuration for L2 DataCache
    * [OPENJPA-1136] - Add .gitignore for git users
    * [OPENJPA-1171] - Use StringBuilder instead of StringBuffer in SQLBuffer
    * [OPENJPA-1172] - Use java.util.concurrent.ConcurrentHashMap rather than a synchronized HashMap in ClassMapping.
    * [OPENJPA-1414] - Performance improvements for detach
    * [OPENJPA-1415] - Performance improvement by reduced logging of batched OLE

Test
    * [OPENJPA-1071] - Derby test suit speed-up
    * [OPENJPA-1092] - enable test case for jpql

Changes for previous releases

OpenJPA 1.2.1 Changes: http://svn.apache.org/viewvc/openjpa/tags/1.2.1/openjpa-project/CHANGES.txt?view=co

OpenJPA 1.2.0 Changes: http://svn.apache.org/viewvc/openjpa/tags/1.2.0/openjpa-project/CHANGES.txt?view=co

