                           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.0 and the
   preceding releases, 0.9.6 and 0.9.7. 1.0.0 is the first major 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
