                           Release Notes for OpenJPA

        * Overview
        * License
        * Prerequisites
        * Documentation
        * Getting Involved
        * Bugs
        * Improvements
        * New Features
        * Task
        * Test

Overview

   These notes describe the difference between OpenJPA release 1.1.0 and the
   preceding releases, 0.9.6, 0.9.7, and 1.0.0. 

   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.

                          OpenJPA 1.1.0 Release Notes

New Features
        * [OPENJPA-130] - Streaming LOB support
        * [OPENJPA-147] - <T> T OpenJPAEntityManager.createInstance(Class<T> cls) fails when T is interface
        * [OPENJPA-344] - Allow serialization of runtime parsed data, and loading of serialized data into runtime caches
        * [OPENJPA-404] - Backward-compatibility for pre-1.0 APIs
        * [OPENJPA-417] - Support more elements in collections and maps
        * [OPENJPA-430] - Automatically remove hungarian notation from column names.
        * [OPENJPA-469] - Generic (user, custom) GeneratedValue
        * [OPENJPA-490] - JPQL extension: aggregates in ORDER BY
        * [OPENJPA-491] - JPQL extension: scalar functions in GROUP BY
        * [OPENJPA-492] - JPQL extension: scalar functions in SELECT
        * [OPENJPA-544] - Remove JDK1.4 support

Sub-tasks
        * [OPENJPA-408] - Improve error processing for openjpa.RuntimeUnenhancedClasses property settings
        * [OPENJPA-502] - JPQL compliance setting
        * [OPENJPA-517] - Oracle also supports WITH statements
        * [OPENJPA-591] - Entities are flushed before being detached or serialized

Bugs
        * [OPENJPA-9] - PCEnhancer not processing multiple PU's defined within a single persistence.xml file
        * [OPENJPA-78] - Automatic runtime enhancement only works when the class is listed in the first persistence-unit
        * [OPENJPA-113] - when you specify columm table="empbean" in the xml file entity id or basic type when empbean is the default table name, the mapping tool generates extra foreign key field (eg.EmpBean_empid) in the table produced.
        * [OPENJPA-231] - Incorrect handling of cascading bidirectional collections during merge/attach
        * [OPENJPA-245] - Attach NEW and auto-increment identity
        * [OPENJPA-251] - org.apache.openjpa.enhance.Reflection.getDeclaredMethod() has undefined behavior, leading to VM-dependent crashes
        * [OPENJPA-255] - Inconsistent behavior during merge with cascade=none
        * [OPENJPA-258] - MetaDataInheritanceComparator is not transitive; C > B > A > C leads to out-of-memory crash in PCEnhancer
        * [OPENJPA-282] - Postgresql does not support deferred unique constraints.
        * [OPENJPA-295] - ArrayIndexOutofBoundsException when under load and within a managed Transaction
        * [OPENJPA-322] - Timezone on the Calendar object lost in proxying
        * [OPENJPA-326] - NPE if a discriminator column is specified without discriminator type in orm.xml
        * [OPENJPA-329] - Generic interface may cause the openjpa Reflection code to pickup the wrong getter method
        * [OPENJPA-331] - Allow BigInteger and other Basic types as Primary Keys
        * [OPENJPA-335] - Logic in getters for entities with property access causes the PCEnhancer to hang
        * [OPENJPA-339] - Java 2 security Access denied in File.toURL() call
        * [OPENJPA-343] - Do not call setRollbackOnly on inactive Transactions
        * [OPENJPA-346] - PCEnhancerAgent backwards-compatibility setting overly-enables enhancement
        * [OPENJPA-347] - Performance Issue with Lazy Loaded Foreign Keys
        * [OPENJPA-353] - Character discriminators are not converted correctly if storeCharsAsNumbers = true
        * [OPENJPA-355] - OpenJPA Log4J factory incorrectly handles logging level
        * [OPENJPA-356] - DB2 requires CASTs when parameters appear in SELECT clause
        * [OPENJPA-357] - Use case where FetchGroup A includes FecthGroup B is not honoured by fetch operations
        * [OPENJPA-358] - Recursion Depth for Field f should be calculated w.r.t active fetch groups and not all fetch groups
        * [OPENJPA-359] - OptimisticLockException NOT thrown for entity using Timestamp Version when update from concurrent persistence contexts
        * [OPENJPA-360] - SQL FOR UPDATE OF incorrectly generated for DB2/NT SQL0816
        * [OPENJPA-361] - Incorrect GREG_OFFSET offset or inconsistent usage in UUIDGenerator
        * [OPENJPA-364] - maven build order is incorrect
        * [OPENJPA-366] - InternalException thrown in BrokerImpl.endOperation
        * [OPENJPA-367] - PCEnhancer does not find meta data for entities using pure XML annotation
        * [OPENJPA-368] - Multithreaded client fails randomly on EntityManager.persist() with out transaction context.
        * [OPENJPA-369] - AccessDeclaredMembers RuntimePermission requires by Solaris JDK with security enabled
        * [OPENJPA-370] - LoadFetchGroup annotation was not recognized during the fetch1
        * [OPENJPA-372] - PCEnhancer throws away its classloader
        * [OPENJPA-375] - DB2 autoCommit(true) causes Result Set prematurely closed in WebContainer JEE environment.
        * [OPENJPA-378] - DB2 SQL incorrectly generating "FETCH FIRST n ROWS ONLY" in subselects
        * [OPENJPA-379] - StoreException when using a third party connection pool against Sybase
        * [OPENJPA-380] - Connecting to database when an unused emf is closed
        * [OPENJPA-381] - OpenJPA is not doing Optimistic locking when running in JEE evnironment
        * [OPENJPA-382] - Overriding column names for Byte[] attributes causes exception.
        * [OPENJPA-385] - IndexOutOfBounds exception when parsing ".class" files
        * [OPENJPA-387] - Getting "java.lang.ClassNotFoundException" when loading datacache plug-in which is a class outside of OpenJPA package.
        * [OPENJPA-388] - MappingToolTask can't find persistence meta data.
        * [OPENJPA-389] - em.getTransaction().commit() is not issuing database commit for NativeQuery requesting updates
        * [OPENJPA-392] - Some columnDefinition annotation properties incorrectly used as column name instead of type
        * [OPENJPA-395] - Accessing short Foreign Key metadata fields as ints causes problems on iSeries
        * [OPENJPA-396] - Cloning Calendar proxies doesn't detach from StateManager
        * [OPENJPA-397] - schematool ant task always requires files
        * [OPENJPA-399] - openjpa did not handle multiple schema names with same table name
        * [OPENJPA-401] - UnsatisfiedLinkError in MappingToolTask when using DB2 JDBC driver
        * [OPENJPA-402] - Unable to detect an valid Entity's meta data when the entity's .class file size is large.
        * [OPENJPA-403] - LoadFetchGroup patch (OPENJPA-370) introduces NPE
        * [OPENJPA-405] - need extract space in the message text
        * [OPENJPA-409] - Quick message updates
        * [OPENJPA-410] - Change "connecting to dictionary" message from Info to Trace
        * [OPENJPA-413] - Fix some message text in the localizer.properties files
        * [OPENJPA-415] - Garbage collection of AbstractResultList instance closes active connection
        * [OPENJPA-416] - Unclear exception if an unknown external value is used
        * [OPENJPA-419] - Merging graphs that include managed instances fails
        * [OPENJPA-420] - JPQL constructor query close the <SELECT DISTINCT> feature?
        * [OPENJPA-421] - OpenJPA generates bad SQL before configuration fully populated
        * [OPENJPA-422] - Calendar objects contained in a detached Entity still have a "live" StateManagerImpl
        * [OPENJPA-423] - Deadlock victim exception getting sequence value with SQLServer
        * [OPENJPA-426] - Incorrect DEFERRABLE usage with PostgreSQL
        * [OPENJPA-427] - PostgresDictionary should set "63" as "maxAutoAssignNameLength".
        * [OPENJPA-437] - EntityManagerFactory is not thread-safe
        * [OPENJPA-439] - Performance degradation in multi-transaction operations
        * [OPENJPA-440] - Calendar instance doesn't appear to detach properly (or proxying of it is in error?)
        * [OPENJPA-446] - Problem when setting String fields of detached objects
        * [OPENJPA-447] - Query pagination broken for non-DB2 databases
        * [OPENJPA-452] - Error in the XML equivalent in the "secondary table field mapping" example
        * [OPENJPA-455] - Incorrect MySQL DDL Generation for integer types
        * [OPENJPA-456] - Missed to validate the column name length for Join Column
        * [OPENJPA-460] - Can't convert to: Time, InformixDictionary needs timeTypeName set to "DATETIME HOUR TO SECOND"
        * [OPENJPA-464] - Performance improvement with Statement Batching support
        * [OPENJPA-471] - iSeries DB2 problem with using @GeneratedValue(strategy=GenerationType.IDENTITY)
        * [OPENJPA-472] - iSeries DB2 problem with using @GeneratedValue(strategy=GenerationType.SEQUENCE ...)
        * [OPENJPA-476] - Query.setFirstResult and Query.setMaxResults don't take effect
        * [OPENJPA-484] - H2Dictionary has 'useGetObjectForBlobs' set to true, which should be false
        * [OPENJPA-489] - DB2Dictionary casts string data to VARCHAR(1000) regardless of data length
        * [OPENJPA-498] - OpenJPA 1.1.0-SNAPSHOT attempts to mutate unmodifiable map in Glassfish
        * [OPENJPA-505] - CLONE -Incorrect Oracle DDL Generation for integer types since OPENJPA-455
        * [OPENJPA-506] - PreRemove method callback is never called; PreUpdate is always called
        * [OPENJPA-508] - JPQL EXISTS clauses do not handle subclasses properly
        * [OPENJPA-511] - Unable to execute native queries which start with the WITH keyword.
        * [OPENJPA-512] - Maven build fails if -Dmaven.test.skip=true
        * [OPENJPA-516] - Exceptions when persisting Entities with fields map to NVARCHAR columns
        * [OPENJPA-518] - openJpa jar is being locked causing future deployments on an app server to fail
        * [OPENJPA-529] - ManagedClassSubclasses stores table names twice.
        * [OPENJPA-530] - Statement batching incorrectly re-arranged order of SQL statements organized by update managers
        * [OPENJPA-532] - SchemaTool performs no function if no pu is found.
        * [OPENJPA-535] - Javadoc spelling errors in SchemaFactory and Localizer
        * [OPENJPA-536] - getMetaData() causes OutOfMemoryError under some cases
        * [OPENJPA-537] - openjpa-parent pom should not overwrite central repository setting
        * [OPENJPA-538] - In the case when user id and password are provided, openjpa should use them in the call to getConnection to avoid "Null userid is not supported" thrown from the backend.
        * [OPENJPA-539] - Can't create a table with a field of java type "Map" in Derby.
        * [OPENJPA-540] - Classloading issue with WAS, Spring, and OpenJPA
        * [OPENJPA-542] - OracleDictionary.getEmptyClob uses its classloader instead of the current classloader.
        * [OPENJPA-543] - Unclosed prepared statements in SQLStoreQuery.executeUpdate.
        * [OPENJPA-547] - INNER JOIN Fetch query incorrectly generates LEFT join SQL
        * [OPENJPA-552] - Do not recognize Connection* properties in persistence.xml in appl server container
        * [OPENJPA-559] - java.rmi.MarshalException due to mismatched serialization UIDs of: Source (RepId RMI:org.apache.openjpa.kernel.DetachedStateManager
        * [OPENJPA-562] - NPE when trying to invoke FieldMetada.getOrders() when a PersistenCollection field is being loaded.
        * [OPENJPA-565] - Duplicate @NamedQuery terminates subsequent @NameQuery definitions in @NamedQueries
        * [OPENJPA-567] - @OrderColumn generates duplicate order numbers.
        * [OPENJPA-568] - Delete, re-insert and setting relationship in the same transaction results in
        * [OPENJPA-573] - JPQL: The combination LIKE ESCAPE does not accept parameters
        * [OPENJPA-576] - Recursively embedded entities generate an extra and reduntant SQL call to the database.
        * [OPENJPA-577] - OpenJPA doesn't create LoggingConnectionDecorator instance if log trace is not enabled
        * [OPENJPA-579] - JDO Projection query with for a complex object with a clob field fails
        * [OPENJPA-585] - Got EntityExistsException when invoking EntityManager.merge() to persist a new entity bean with generated id and enhanced at deployment time
        * [OPENJPA-587] - Sybase queries that select columns from derived tables fail OOTB
        * [OPENJPA-588] - Test for checking the absolute index of field metadata fails
        * [OPENJPA-589] - Can not retrieve M-to-M data when DataCache is on
        * [OPENJPA-594] - Incorrect schema separator used for Informix tables
        * [OPENJPA-595] - An error occurred while parsing the query filter "SELECT t FROM PessimisticA t WHERE t.id = ?1". Error message: No field named "id" in class "t"

Improvements
        * [OPENJPA-338] - Remove unnecessary CAST in SQL statement for DB2
        * [OPENJPA-374] - OpenJPA build process enhances Entity classes even when testing is deactivated via -Dtest=false
        * [OPENJPA-407] - Cache SQL (or closer precursors to SQL) more aggressively
        * [OPENJPA-448] - Documentation fixes (1. openjpa.NontransactionalWrite, 2. setRollbackOnly)
        * [OPENJPA-454] - Better support for running unit tests on DB2
        * [OPENJPA-488] - Simplify JPQL SUBSTRING clauses involving literal index and position data
        * [OPENJPA-500] - OpenJPAEntityManager.isManaged() is a confusing method name
        * [OPENJPA-522] - pushFetchGroup(s) and popFetchGroup(s) on OpenJPAEntityManager
        * [OPENJPA-541] - Generate SQL92 JOIN syntax for Oracle 9 or later releases
        * [OPENJPA-564] - Set correct DBDictionary properties for MySQL based on MySQL version
        * [OPENJPA-570] - Misleading "Found duplicate query" warning message

                          OpenJPA 1.0.2 Release Notes

Bugs

        * [OPENJPA-135] - join fetch not returning duplicate references which not conforming to ejb3.0 spec
        * [OPENJPA-211] - CLONE -java.lang.VerifyError on websphere 6.1 with Spring 2.0.3 and OpenJpa 0.96/0.97
        * [OPENJPA-251] - org.apache.openjpa.enhance.Reflection.getDeclaredMethod() has undefined behavior, leading to VM-dependent crashes
        * [OPENJPA-258] - MetaDataInheritanceComparator is not transitive; C > B > A > C leads to out-of-memory crash in PCEnhancer
        * [OPENJPA-322] - Timezone on the Calendar object lost in proxying
        * [OPENJPA-329] - Generic interface may cause the openjpa Reflection code to pickup the wrong getter method
        * [OPENJPA-331] - Allow BigInteger and other Basic types as Primary Keys
        * [OPENJPA-366] - InternalException thrown in BrokerImpl.endOperation
        * [OPENJPA-367] - PCEnhancer does not find meta data for entities using pure XML annotation
        * [OPENJPA-370] - LoadFetchGroup annotation was not recognized during the fetch1
        * [OPENJPA-401] - UnsatisfiedLinkError in MappingToolTask when using DB2 JDBC driver
        * [OPENJPA-419] - Merging graphs that include managed instances fails
        * [OPENJPA-420] - JPQL constructor query close the <SELECT DISTINCT> feature?
        * [OPENJPA-437] - EntityManagerFactory is not thread-safe
        * [OPENJPA-446] - Problem when setting String fields of detached objects
        * [OPENJPA-447] - Query pagination broken for non-DB2 databases
        * [OPENJPA-452] - Error in the XML equivalent in the "secondary table field mapping" example
        * [OPENJPA-471] - iSeries DB2 problem with using @GeneratedValue(strategy=GenerationType.IDENTITY)
        * [OPENJPA-472] - iSeries DB2 problem with using @GeneratedValue(strategy=GenerationType.SEQUENCE ...)
        * [OPENJPA-476] - Query.setFirstResult and Query.setMaxResults don't take effect
        * [OPENJPA-506] - PreRemove method callback is never called; PreUpdate is always called
        * [OPENJPA-508] - JPQL EXISTS clauses do not handle subclasses properly
        * [OPENJPA-511] - Unable to execute native queries which start with the WITH keyword.

                          OpenJPA 1.0.1 Release Notes

Bugs Fixed

        * [OPENJPA-113] - when you specify columm table="empbean" in the xml file entity id or basic type when empbean is the default table name, the mapping tool generates extra foreign key field (eg.EmpBean_empid) in the table produced.
        * [OPENJPA-282] - Postgresql does not support deferred unique constraints.
        * [OPENJPA-295] - ArrayIndexOutofBoundsException when under load and within a managed Transaction
        * [OPENJPA-326] - NPE if a discriminator column is specified without discriminator type in orm.xml
        * [OPENJPA-335] - Logic in getters for entities with property access causes the PCEnhancer to hang
        * [OPENJPA-339] - Java 2 security Access denied in File.toURL() call
        * [OPENJPA-343] - Do not call setRollbackOnly on inactive Transactions
        * [OPENJPA-346] - PCEnhancerAgent backwards-compatibility setting overly-enables enhancement
        * [OPENJPA-347] - Performance Issue with Lazy Loaded Foreign Keys
        * [OPENJPA-353] - Character discriminators are not converted correctly if storeCharsAsNumbers = true
        * [OPENJPA-355] - OpenJPA Log4J factory incorrectly handles logging level
        * [OPENJPA-356] - DB2 requires CASTs when parameters appear in SELECT clause
        * [OPENJPA-357] - Use case where FetchGroup A includes FecthGroup B is not honoured by fetch operations
        * [OPENJPA-358] - Recursion Depth for Field f should be calculated w.r.t active fetch groups and not all fetch groups
        * [OPENJPA-360] - SQL FOR UPDATE OF incorrectly generated for DB2/NT SQL0816
        * [OPENJPA-361] - Incorrect GREG_OFFSET offset or inconsistent usage in UUIDGenerator
        * [OPENJPA-367] - PCEnhancer does not find meta data for entities using pure XML annotation
        * [OPENJPA-368] - Multithreaded client fails randomly on EntityManager.persist() with out transaction context.
        * [OPENJPA-369] - AccessDeclaredMembers RuntimePermission requires by Solaris JDK with security enabled
        * [OPENJPA-372] - PCEnhancer throws away its classloader
        * [OPENJPA-375] - DB2 autoCommit(true) causes Result Set prematurely closed in WebContainer JEE environment.
        * [OPENJPA-378] - DB2 SQL incorrectly generating "FETCH FIRST n ROWS ONLY" in subselects
        * [OPENJPA-380] - Connecting to database when an unused emf is closed
        * [OPENJPA-382] - Overriding column names for Byte[] attributes causes exception.
        * [OPENJPA-385] - IndexOutOfBounds exception when parsing ".class" files
        * [OPENJPA-387] - Getting "java.lang.ClassNotFoundException" when loading datacache plug-in which is a class outside of OpenJPA package.
        * [OPENJPA-388] - MappingToolTask can't find persistence meta data.
        * [OPENJPA-389] - em.getTransaction().commit() is not issuing database commit for NativeQuery requesting updates
        * [OPENJPA-394] - DB2 CAST VARCHAR type missing LENGTH
        * [OPENJPA-395] - Accessing short Foreign Key metadata fields as ints causes problems on iSeries
        * [OPENJPA-396] - Cloning Calendar proxies doesn't detach from StateManager
        * [OPENJPA-397] - schematool ant task always requires files
        * [OPENJPA-399] - openjpa did not handle multiple schema names with same table name
        * [OPENJPA-401] - UnsatisfiedLinkError in MappingToolTask when using DB2 JDBC driver
        * [OPENJPA-402] - Unable to detect an valid Entity's meta data when the entity's .class file size is large.
        * [OPENJPA-403] - LoadFetchGroup patch (OPENJPA-370) introduces NPE
        * [OPENJPA-405] - need extract space in the message text
        * [OPENJPA-409] - Quick message updates
        * [OPENJPA-410] - Change "connecting to dictionary" message from Info to Trace
        * [OPENJPA-413] - Fix some message text in the localizer.properties files
        * [OPENJPA-415] - Garbage collection of AbstractResultList instance closes active connection
        * [OPENJPA-416] - Unclear exception if an unknown external value is used
        * [OPENJPA-421] - OpenJPA generates bad SQL before configuration fully populated
        * [OPENJPA-422] - Calendar objects contained in a detached Entity still have a "live" StateManagerImpl
        * [OPENJPA-423] - Deadlock victim exception getting sequence value with SQLServer

Improvements

        * [OPENJPA-338] - Remove unnecessary CAST in SQL statement for DB2

Sub-tasks

        * [OPENJPA-408] - Improve error processing for openjpa.RuntimeUnenhancedClasses property settings

                          OpenJPA 1.0.0 Release Notes

Bugs fixed

        * [OPENJPA-61] - Missing usage of TransactionSynchronizationRegistry
        * [OPENJPA-86] - "uuid-hex" generator does not make affect in orm.xml
        * [OPENJPA-143] - Problems with Single Table Inheritance Strategy (and
         Discriminator Type of Integer)
        * [OPENJPA-165] - QueryImpl.setFirstResult does not take already set
         maxResults into account
        * [OPENJPA-177] - When using NOT NULL constraint on foreign key it is
         not possible to use CascadeType.ALL and GeneratedId
        * [OPENJPA-199] - bulk update gets parsing exception trying to update
         an attribute of an embedded class
        * [OPENJPA-244] - Java 2 Security enablement
        * [OPENJPA-248] - ForeignKey cascade delete action not working
        * [OPENJPA-257] - Getter/Setter type inconsistency in Entity IdClass
        * [OPENJPA-269] - Informix doesn't support subselects or using table
         aliases in a delete statement.
        * [OPENJPA-271] - DB2 missing JDBC driver 2 support
        * [OPENJPA-272] - @GenerateValue (AUTO) doesn't work with Property
         level access
        * [OPENJPA-274] - JPQL queries cannot access version fields, including
         bulk updates
        * [OPENJPA-278] - OpenJPAQuery.getDataStoreActions() returns an empty
         String array
        * [OPENJPA-280] - Enhancement failure for inherited fields introduced
         with change 532137
        * [OPENJPA-281] - EAGER not the default fetch type without the @Basic
         annotation
        * [OPENJPA-284] - TableJDBCSeq for GeneratedValue.TABLE did not handle
         initialValue correctly
        * [OPENJPA-285] - Multiple deploy/undeploy leaks memory in PCRegistry
        * [OPENJPA-287] - Generated methods on superclasses are not visible to
         subclasses
        * [OPENJPA-294] - Exception while enchnancing the java classes using
         OpenJPA PCEnhancerTask with build.xml
        * [OPENJPA-296] - UUID algorithm generating non-unique values
         sometimes
        * [OPENJPA-304] - Problems with DepthFirstAnalysis and the IBM JDK
        * [OPENJPA-308] - Postgres: bytea vs. oid handling in
         PreparedStatement.setNull() calls
        * [OPENJPA-311] - Problem loading classes with OSGi classloaders
        * [OPENJPA-312] - derby fails with duplicate primary key(s) in group
         by list
        * [OPENJPA-313] - list of objects returned by query partially correct
        * [OPENJPA-314] - Unenhanced complex id in MappedSuperclass causes NPE
        * [OPENJPA-315] - Unenhanced generated id field of a primitive wrapper
         type causes NPE
        * [OPENJPA-320] - Do not use System Tables (SYS*) with DB2
        * [OPENJPA-321] - DB2 ABS Casting problem
        * [OPENJPA-322] - Timezone on the Calendar object lost in proxying
        * [OPENJPA-323] - Cleanup some message text
        * [OPENJPA-256] - java.lang.ClassNotFoundException:
         org.apache.openjpa.util.CacheMap in a jetty spring environment

Sub-tasks

        * [OPENJPA-279] - Fixed missing lookup for non-jta-data-source in
         JDBCConfigurationImpl.
        * [OPENJPA-297] - Lazy loading must be ignored in certain unenhanced
         cases
        * [OPENJPA-298] - Miscellaneous documentation improvements
        * [OPENJPA-299] - Provide a means to enable the old enhancing agent

Improvements

        * [OPENJPA-259] - Ability to parse EJB QL multiline queries in orm.xml
        * [OPENJPA-266] - Add Extensibility: Change "private" field/method to
         "protected" or "public" in OpenJPA classes to be extendable
        * [OPENJPA-275] - Bulk updates: version information should be
         automatically maintained when the query does not

New Features

        * [OPENJPA-168] - sql optimize n rows query hint
        * [OPENJPA-239] - Option for the reverse mapping tool to generate
         mapping annotations
        * [OPENJPA-262] - Event notification of BrokerFactory creation
        * [OPENJPA-263] - Introducing getAll(List) method for data cache to be
         called by loadAll() will allow data cache plug-ins to leverage the
         advantage of any third-party cache that provides a way to get
         multiple object in one call by providing a list of keys (oids).
        * [OPENJPA-317] - API formalization pre-1.0

                          OpenJPA 0.9.7 Release Notes

Bugs

   The following bugs have been fixed for release 0.9.7
        * [OPENJPA-16] - NPE in createQuery for EJB QL with nested correlated
       subqueries
        * [OPENJPA-21] - Time is missing from list of mutable classes.
        * [OPENJPA-22] - locate & substring queries fail both db2 & derby,
       cannot use parameter markers in expression ?-?
        * [OPENJPA-23] - -418 sqlexception using DB2 and EJB QL with SQRT or MOD
        * [OPENJPA-24] - Allow OpenJPA to be extensible
        * [OPENJPA-25] - Incorrect SQL generated for queries involving more than
       one AbstractSchemaNames, generated SQL FROM clause is missing 'Table
       alias'
        * [OPENJPA-35] - In-memory Delete operation fails with active DataCache
        * [OPENJPA-41] - transforming classes doesn't work
        * [OPENJPA-48] - parsing error - cast of subselect does not work
        * [OPENJPA-50] - bad sql pushdown, cast changes datatype
        * [OPENJPA-53] - bad sql pushdown for nested subselects, missing nested
       subselect
        * [OPENJPA-54] - bad sql pushdown, should use all syntax
        * [OPENJPA-56] - in derby concat with input parameter needs a cast,
       otherwise becomes long varchar and some operations do not work
        * [OPENJPA-60] - Specifying the wrong persistence implementation in
       persistence.xml leads to misleading error message
        * [OPENJPA-62] - Ejbql join queries show invalid null Entities when run
       in a new persistence context where no entity instances exist.
        * [OPENJPA-71] - Caching primitive array types consumes excessive memory
        * [OPENJPA-77] - Problems in default setting in DB2Dictionary , also
       missing support for DB2 z/OS platforms
        * [OPENJPA-80] - Bad Escaping for LIKE in MySQL
        * [OPENJPA-98] - Java deadlock when insert in t1 and find in t2 when
       using IBM JVM 1.5.0
        * [OPENJPA-100] - entries failing to be processed for persistence unit
       rooted in an EAR
        * [OPENJPA-102] - JTA transaction rollback, nonexistant instances,
       transactional persistence context => failures during afterCompletion()
       and close()
        * [OPENJPA-103] - Default Listeners not being processed correctly
        * [OPENJPA-104] - OpenJPA does not detach instances on rollback()
        * [OPENJPA-107] - @SqlResultSetMappings fails in mapping tool with
       java.lang.ArrayStoreException
        * [OPENJPA-108] - @AttributeOverrides fails in mapping tool with
       java.lang.ArrayStoreException
        * [OPENJPA-109] - every NativeQuery using SqlResultSetMapping fails at
       runtime with There is no query result mapping for "null" with name
       "xxx" when the entity is persisted in a different method than the
       method doing the query.
        * [OPENJPA-110] - Every NamedNativeQuery using ResultSetMapping fails at
       runtime with class cast exception when try to iterate over list
        * [OPENJPA-111] - native queries fail when use named parameters
        * [OPENJPA-115] - Bottleneck(s) with using OpenJPA in a
       Container-managed environment
        * [OPENJPA-116] - EntityManager.getDelegate should throw an
       IllegalStateException
        * [OPENJPA-118] - AutoDetach property has no effect
        * [OPENJPA-119] - EntityManager.clear() should not implicitly invoke the
       flush operation
        * [OPENJPA-121] - Table name defaults to the class name instead of the
       entity name
        * [OPENJPA-122] - EntityManager does not throw exceptions after close()
       in required cases
        * [OPENJPA-132] - java.lang.NoSuchMethodError for entity with ID of type
       java.sql.Date
        * [OPENJPA-133] - Can't find non-public callback methods with superclass
       or interface parameters
        * [OPENJPA-134] - Extra unneeded SQL joins for OneToMany relationship
       with fetch type EAGER
        * [OPENJPA-139] - PersistenceException merging an entity with a Calendar
       field.
        * [OPENJPA-140] - Wrong package name in test classes
        * [OPENJPA-142] - Entity name is ignored when specified in the orm.xml
       file
        * [OPENJPA-144] - JDBCConfigurationImpl does not support JNDI lookup for
       non-jta-data-source.
        * [OPENJPA-146] - Entity enhancement fails while using EmbeddedId on a
       MappedSuperclass
        * [OPENJPA-150] - @Column in @AttributeOverride not honoring table
       attribute that maps to a secondary table in mappedsuperclass entity
        * [OPENJPA-154] - OptimisticLockException working with Savepoints
        * [OPENJPA-155] - java.lang.ArrayIndexOutOfBoundsException during commit
        * [OPENJPA-157] - NullPointerException when running query with null
       parameter
        * [OPENJPA-162] - @OrderBy on @OneToMany does not allow ordering by @Id
       value
        * [OPENJPA-174] - error when find()'ing an abstract class
        * [OPENJPA-175] - Eager selects by PagingResultObjectProvider may not
       use the FetchBatchSize
        * [OPENJPA-179] - Schemas defined in orm.xml are only applied when a
       name is also specified.
        * [OPENJPA-181] - ClassCastException when executing bulk delete on an
       entity that owns a OneToOne with a Cascade.DELETE when DataCache is on
        * [OPENJPA-185] - optional attribute is not overriden by xml descriptor
        * [OPENJPA-186] - Build failure of OpenJPA sources from trunk
   * [OPENJPA-202] - after invoking LRS processing in a client by calling an
     @LRS annotated relationship, the next em.clear()/em.close() gets
     org.apache.openjpa.persistence.InvalidStateException: You cannot
     transfer large result set fields from one object or field to another
   * [OPENJPA-208] - NoResultException and NonUniqueResultException are not
     thrown when expected
   * [OPENJPA-214] - Need to support floating point primary keys

Improvements

     Improvements made for release 0.9.7
        * [OPENJPA-10] - persistence unit name should be default diagnostic
         context for standard OpenJPA log impl
        * [OPENJPA-37] - Support ant typedefs for OpenJPA tasks
        * [OPENJPA-55] - Allow executeUpdate() invocations on native queries
        * [OPENJPA-57] - persistence_1_0.xsd is missing
        * [OPENJPA-63] - Better pessimistic lock support for DB2 v8.2+
        * [OPENJPA-151] - Added field in enhanced vesrion of a class is not
         serialized. Hence the change in detached+serialized instances is not
         registered under certain conditions.
        * [OPENJPA-153] - WebSphere and non-jta-data-source and default
         ManagedRuntime
        * [OPENJPA-158] - OpenJPA logs overly-verbose at INFO level
        * [OPENJPA-161] - Overuse of synchronization in AbstractBrokerFactory
        * [OPENJPA-166] - Track the reason why a setRollbackOnly invocation
         was made
        * [OPENJPA-176] - Exception prefixes should be human-readable
        * [OPENJPA-196] - Ease the restrictions on forcing a matche between
         the number of declared and assigned positional parameters

New Features

     Features added for release 0.9.7
        * [OPENJPA-92] - Support for H2 Database Engine
        * [OPENJPA-93] - Sequence generation in a JTA environment should not
         require non-JTA datasource
        * [OPENJPA-94] - Allow MappingTool and persistence.xml to support
         drop-create for database schema
        * [OPENJPA-182] - db2 update lock syntax WITH USE AND KEEP UPDATE
         LOCKS

Task

     Tasks done for release 0.9.7
        * [OPENJPA-36] - Add cwiki url to incubator status page

Test

     Additional testing done for release 0.9.7
        * [OPENJPA-40] - Testing OpenJPA and Spring integration fails

