                           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.0.1 and the
   preceding releases 0.9.7 and 1.0.0. 1.0.1 is the first maintenance release
   since OpenJPA graduated to an Apache top level project (TLP), and contains
   many new features and bugfixes.

   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

   OpenJPA requires Java 1.5 but will not compile with Java 6. For more
   detail please see http://issues.apache.org/jira/browse/OPENJPA-5

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 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

                          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-task

       * [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 Feature

       * [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 1.0.1 Release Notes

** Bug
    * [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-135] - join fetch not returning duplicate references which not 
      conforming to ejb3.0 spec
    * [OPENJPA-209] - Query returning 2 entities w/unidir 1-1 relationship gets 
      openjpa.persistence.ArgumentException: Address with the same id already 
      exists in the L1 cache.
    * [OPENJPA-210] - Query returning 2 entities w/1-1 relationship returns 
      wrong types in the result list
    * [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-282] - Postgresql does not support deferred unique constraints.
    * [OPENJPA-295] - ArrayIndexOutofBoundsException when under load and within 
      a managed Transaction
    * [OPENJPA-316] - Unenhanced OneToMany collection not loaded
    * [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-360] - SQL FOR UPDATE OF incorrectly generated for DB2/NT SQL0816
    * [OPENJPA-361] - Incorrect GREG_OFFSET offset or inconsistent usage in 
      UUIDGenerator
    * [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-372] - PCEnhancer throws away its classloader
    * [OPENJPA-375] - DB2 autoCommit(true) causes Result Set prematurely closed 
      in WebContainer JEE environment.
    * [OPENJPA-376] - Need more trace for transaction demarcation
    * [OPENJPA-377] - RuntimeUnenhancedClasses support can go into a 
      "half baked" state
    * [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-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-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

** Sub-task
    * [OPENJPA-309] - CTS passing in at least JDK6
    * [OPENJPA-408] - Improve error processing for 
      openjpa.RuntimeUnenhancedClasses property settings

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

