blob: 02ee86ec96913fc3d0c9aac56144475976a3e01a [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
-->
<appendix id="migration_considerations" role="non-normative">
<title>
Migration Considerations
</title>
<section id="jpa_2.0">
<title>
OpenJPA 2.0.0
</title>
<section id="jpa_2.0_incompatibilities">
<title>
Incompatibilities
</title>
<!-- See OPENJPA-1208 for details. -->
<para>
The following sections indicate changes that are incompatible
between OpenJPA 1.x.x releases and the 2.0 release. Some may
require application changes. Others can be remedied through the
use of compatibility options. If your application uses a
version 1.0 persistence.xml, compatibility options will be set
appropriately to maintain backward compatibility. OpenJPA 2.0
applications using a version 2.0 persistence.xml and requiring
OpenJPA 1.x.x compatibility may need to configure the
appropriate compatibility options to get the desired behavior.
</para>
<section id="getProperties">
<title>
getProperties()
</title>
<!-- See OPENJPA-849 for details. -->
<para>
The OpenJPAEntityManagerFactory interface getProperties()
method was changed to return a Map instead of a
Properties object. This change was made in order to
support the getProperties() method defined in the
JPA 2.0 specification.
</para>
</section>
<section id="migration_detach_behavior">
<title>
Detach Behavior
</title>
<!-- See OPENJPA-1215 for details. -->
<para>
The detach behavior has changed in several ways:
<itemizedlist>
<listitem>
<para>
In the 1.x.x release, managed entities
were flushed to the database as part of the
detach operation. This is no longer done in
2.0.
</para>
</listitem>
<listitem>
<para>
In the 1.x.x release, entities were copied
and returned. In 2.0, for those methods
that have return values, the original
entities are returned.
</para>
</listitem>
<listitem>
<para>
In the 1.x.x release, managed entities still
exist in the persistent context. In 2.0,
they are removed.
</para>
</listitem>
<listitem>
<para>
In the 1.x.x release, the detach operation
is recursively cascaded to all referenced
entities. In 2.0, the detach operation is
only cascaded to those entities for which
Cascade=detach has been specified.
</para>
</listitem>
</itemizedlist>
</para>
<para>
Applications that use a 1.0 persistence.xml will
automatically maintain OpenJPA 1.x.x behavior. It is
possible for a version 2.0 application to revert back to
the 1.x.x behavior for some of these items by setting the
openjpa.Compatibility property as follows:
<simplelist>
<member>CopyOnDetach=true</member>
<member>FlushBeforeDetach=true</member>
<member>CascadeWithDetach=true</member>
</simplelist>
</para>
<para>
In addition, a new method has been provided on the
<ulink url="../../apidocs/org/apache/openjpa/persistence/OpenJPAEntityManager.html">
<classname>OpenJPAEntityManager</classname></ulink>
interface to return a copy of the entity:
<programlisting>
public &lt;T&gt; T detachCopy(T pc):
</programlisting>
</para>
</section>
<section id="private_persistent_properties">
<title>
Use of private persistent properties
</title>
<!-- See OPENJPA-1176 for details. -->
<para>
In 1.x.x releases of OpenJPA, if property access was used,
private properties were considered persistent. This is
contrary to the JPA specification, which states that
persistent properties must be public or protected. In
OpenJPA 2.0 and later, private properties will not be
persistent by default.
</para>
<para>
Applications that use a 1.0 persistence.xml will
automatically maintain OpenJPA 1.x.x behavior. It is
possible for a version 2.0 application to revert back to
the 1.x.x behavior by setting the value of the
<literal>openjpa.Compatibility</literal>
property <literal>PrivatePersistentProperties</literal> to
<literal>true</literal>. If compile time enhancement is
used, this property must be specified at the time of
enhancement and at runtime.
</para>
</section>
<section id="setParameter">
<title>
Query.setParameter()
</title>
<!-- See OPENJPA-1213 for details. -->
<para>
The Query interface setParameter() method behavior has
changed to throw an IllegalArgumentException (as required
by the JPA specification) if more parameter substitutions
are supplied than defined in the createQuery(),
createNamedQuery(), or createNativeQuery() invocation.
OpenJPA 1.2.x and prior versions silently ignored these
extraneous parameter substitutions and allowed the Query
to be processed.
</para>
</section>
<section id="serialization">
<title>
Serialization of Entities
</title>
<!-- See OPENJPA-1097 and OPENJPA-1597 for details. -->
<para>
In 1.x.x releases of OpenJPA, when an entity was serialized
after calling EntityManager.find(), detach() or detachAll()
then all <xref linkend="ref_guide_pc_scos_proxy"/>
references were removed as expected, but when the same
entity instance was serialized after calling
EntityManager.clear() the proxy classes were not removed.
</para>
<para>
This has two side-effects:
when entities are remoted across JVM boundaries (RPC)
or deserialized the OpenJPA runtime must be available
on the classpath (both client and server containers);
when entities are deserialized the OpenJPA runtime must
be the exact same revision as used to serialize the
entities due to the proxy classes using dynamically
generated serialVersionUID values.
</para>
<para>
Starting with OpenJPA 2.0, this behavior has been
modified, so that by default all proxies will be removed
during serialization. See
<xref linkend="ref_guide_pc_scos_proxy_serial"/>
on how the behavior changes based on the
<literal>DetachedStateField</literal> setting along with
<xref linkend="ref_guide_detach_state"/>
for more details on how to override the default
<literal>DetachedStateField</literal> setting.
</para>
<para>
Applications that use a 1.0 persistence.xml will
automatically maintain the old behavior. It is
possible for a version 2.0 application to revert back to
the prior 1.x.x behavior by setting the following
openjpa.Compatibility property as follows:
<simplelist>
<member>IgnoreDetachedStateFieldForProxySerialization=true</member>
</simplelist>
</para>
</section>
<section id="QuerySQLCache">
<title>
openjpa.jdbc.QuerySQLCache
</title>
<!-- See OPENJPA-1179 for details. -->
<para>
In prior 1.x.x releases, the openjpa.jdbc.QuerySQLCache
configuration property for Prepared SQL Cache accepted
value <literal>all</literal> to never drop items from the
cache, but this option is no longer supported and will cause
a PersistenceException with a root cause of a ParseException
to be thrown. See
<xref linkend="ref_guide_cache_querysql"/>
for details on the available configuration values.
</para>
</section>
</section>
<section id="Disabling AutoOff Collection Tracking">
<title>
Disabling AutoOff Collection Tracking
</title>
<!-- See OPENJPA-1223 and OPENJPA-1163 for details. -->
<para>
The default behavior of OpenJPA in tracking collections is that
if the number of modifications to the collection exceeds the
current number of elements in collection then OpenJPA will
disable tracking the collections. OpenJPA 2.0 added a compatibility
property to disable turning off the collection tracking.
</para>
<para>
The behavior of Auto disabling of collection tracking can be
avoided by setting the value of the
<literal>openjpa.Compatibility</literal> property
<literal>autoOff</literal> to <literal>false</literal>.
The default behavior of auto disabling the collection tracking
is not changed. But when the above property is set then the
collection tracking will not be disabled automatically.
</para>
</section>
<section id="internal_differences">
<title>
Internal Behavioral Differences
</title>
<para>
The following sections indicate internal changes between
OpenJPA 1.x.x releases and the 2.0 release. As these are
internal implementation specific behaviors not covered by
the JPA specification, no changes should be required for
applications that did not use or depend upon OpenJPA specific
APIs or behavior.
</para>
<section id="prePostUpdate">
<title>
PreUpdate/PostUpdate Life Cycle Callbacks
</title>
<!-- See OPENJPA-1182 for details. -->
<para>
If an entity was updated between the persist()
and commit() operations in OpenJPA 1.x, then
any PreUpdate and PostUpdate life cycle callback
methods would be executed. Starting in OpenJPA
1.3 and 2.0, these callbacks will not get executed.
</para>
<para>
The JPA 2.0 specification section on "Semantics
of the Life Cycle Callback Methods for Entities"
has been updated to include a Note that the
callback behavior for updating an entity after
the persist operation is implementation specific
and should not be relied upon.
</para>
</section>
<section id="createemf">
<title>
createEntityManagerFactory Exceptions
</title>
<!-- See OPENJPA-1203 for details. -->
<para>
The JPA 2.0 specification section on
"Bootstrapping in Java SE Environments" states
that persistence providers must return null
if they are not a qualified provider for the
given persistence unit.
</para>
<para>
However, OpenJPA may throw a RuntimeException
if an error occurs while trying to create a
qualified persistence unit, like for invalid
openjpa.* specific configuration settings or
for schema validation failures.
</para>
<para>
If the Apache Geronimo JPA 2.0 Spec APIs are
used, then any exceptions returned by a
persistence provider will be wrapped within
a PersistenceException. When the JPA 2.0 API
reference implementation is used, any
RuntimeExceptions will be returned to the
calling application without being wrapped.
Other JPA 2.0 API and implementation providers
or versions may behave differently.
</para>
</section>
<section id="querycache">
<title>
openjpa.QueryCache default
</title>
<!-- See OPENJPA-1469 and sub-tasks for details. -->
<para>
In previous releases, the default value for the
openjpa.QueryCache property was <literal>true</literal>
when the openjpa.DataCache was enabled. Depending on
application characteristics, this default QueryCache
enablement actually could negate much of the potential
gains achieved by using the DataCache. Thus, the default
value for the openjpa.QueryCache property is now
<emphasis><literal>false</literal></emphasis>.
</para>
<para>
To re-enable the default QueryCache behavior, you need to
include the following property in your persistence.xml
configuration.
<programlisting>
&lt;property name="openjpa.QueryCache" value="true"/&gt;
</programlisting>
</para>
<para>
If your configuration had previously enabled the QueryCache
explicitly, then you might have to include the
<literal>true</literal> value into your configuration
(if you relied on the previous default). Otherwise, your
current QueryCache enablement will continue to work.
<programlisting>
&lt;property name="openjpa.QueryCache" value="true(CacheSize=1000, SoftReferenceSize=100)"/&gt;
</programlisting>
</para>
</section>
</section>
</section>
<section id="jpa_2.2">
<title>
OpenJPA 2.2.0
</title>
<section id="jpa_2.2_incompatibilities">
<title>Incompatibilities</title>
<para>
The following sections indicate changes that are incompatible
between OpenJPA 2.1.x releases and the 2.2.0 release.
</para>
<section id="jpa_2.2_allocationSize">
<title>
allocationSize Property of Sequence Generator
</title>
<!-- See OPENJPA-1376 for details. -->
<para>
In previous releases, specifying the <literal>allocationSize</literal> property of
<link linkend="jpa_overview_mapping_sequence_seqgen">sequence generator</link>
affected only sequence definition in the database. During
schema creation, the <literal>INCREMENT BY</literal> clause of
<literal>CREATE SEQUENCE</literal> statement always
had a value of 1 and on DB2, Oracle and PostgreSQL databases a <literal>CACHE</literal> clause
was added with the value of <literal>allocationSize</literal> property. Such a statement caused
sequence values being cached in the database. Starting with OpenJPA 2.2.0,
sequence values are cached in the jvm memory and the <literal>allocationSize</literal>
property determines size of that cache. The <literal>CACHE</literal> clause is no longer used,
instead the <literal>INCREMENT BY</literal> clause gets its value equal to the
<literal>allocationSize</literal> property. Such a strategy reduces the number of database roundtrips
required for retrieving sequence values considerably.
</para>
<para>
In order for the existing applications to work with OpenJPA
2.2.0, you have to manually recreate or redefine sequences, specifying
the correct <literal>INCREMENT BY</literal> value and, possibly, correct initial sequence value.
Note that the default value of the <literal>allocationSize</literal> property is 50 and that
value is used if the property is not specified.
</para>
<para>
The requirement for sequence modification applies to all databases that support sequences, regardless of
the <literal>CACHE</literal> clause being supported. The only exception is Firebird database -
since with this database the increment step is determined during sequence
value fetch, no migration activity is needed.
</para>
<para>
To maintain the old behavior of sequence generator in OpenJPA 2.2.0, you can:
<itemizedlist>
<listitem>
<para>
Set the <literal>allocationSize</literal> property value to 1.
</para>
</listitem>
<listitem>
<para>
Additionally, if the <literal>CACHE</literal> clause has to be emitted in sequence definition,
this can be accomplished by overriding the
<ulink url="../../apidocs/org/apache/openjpa/jdbc/sql/DBDictionary.html#getCreateSequenceSQL(org.apache.openjpa.jdbc.schema.Sequence)">
<methodname>DBDictionary.getCreateSequenceSQL</methodname></ulink> method.
</para>
</listitem>
</itemizedlist>
</para>
</section>
<section id="jpa_2.2_metamodelArrays">
<title>
MetaModel Attributes for Arrays
</title>
<!-- See OPENJPA-2025 for details. -->
<para>
In previous releases OpenJPA's MetaModel implementation generated a ListAttribute for every array. This behavior is correct if the array
is annotated as a PersistentCollection, but not correct for un-annotated arrays (e.g. byte[], char[]). In OpenJPA 2.2.0 this behavior was corrected
so that arrays which are not stored as PersistentCollections will use a SingularAttribute instead of a ListAttribute.
</para>
<para>
If your application uses the MetaModel API and your entities contain arrays of any of the following types: byte[], Byte[], char[], Character[] and
do not use the @PersistentCollection annotation with those fields you will need to update your application to use OpenJPA 2.2.0.
</para>
<para> In order for the existing applications to work with OpenJPA you may:
<itemizedlist>
<listitem>
<para> Regenerate the canonical metamodel classes</para>
</listitem>
<listitem>
<para> Set the Compatibility property <literal>UseListAttributeForArrays</literal> to <literal>true</literal> in persistence.xml
<programlisting> &lt;property name="openjpa.Compatibility" value="UseListAttributeForArrays=true"/&gt;</programlisting>
</para>
</listitem>
</itemizedlist>
</para>
</section>
<section id="jpa_2.2_SupportsSetClob">
<title>
supportsSetClob Property.
</title>
<!-- See OPENJPA-1691 for details. -->
<para>
In OpenJPA 2.2.0, code was added to allow the setting of CLOB or XML data larger than 4000 bytes. This functionality
was eventually back ported to previous releases, and enabled by the <literal>supportsSetClob</literal> property on the OracleDictionary. Setting this property
has no effect in 2.2.0 and later releases and any occurrence of it should be removed.
</para>
</section>
<section id="jpa_2.2_UseNativeSequenceCache">
<title>
useNativeSequenceCache Property.
</title>
<!-- See OPENJPA-1376 for details. -->
<para>
In OpenJPA 2.2.0, code was added which changed the way sequences were generated, please see
<xref linkend="jpa_2.2_allocationSize"/> for details. This functionality was eventually back ported
to previous releases, and enabled by the <literal>useNativeSequenceCache</literal> property on the DBDictionary. Setting this property
has no effect in 2.2.0 and later releases and any occurrence of it should be removed. If previous behavior is
desired (i.e. <literal>useNativeSequenceCache=true</literal>), please see the details described in section
<xref linkend="jpa_2.2_allocationSize"/>.
</para>
</section>
<section id="jpa_2.2_cascadePersist">
<title>
Cascade persist behavior
</title>
<!-- See OPENJPA-1986 for details. -->
<para>
In previous releases, OpenJPA would check the database for the
existence of the related Entity before persisting the relationship to
that Entity. This resulted in an extra Select being sent to the
database. In 2.2.0, code was added so that when cascading a persist to
a related Entity without persistence state, the persist (insert) will
happen without first checking the database. This may result in an
EntityExistsException if the related Entity already exists in the
database. To revert this behavior to the previous release, set the
value of the <literal>openjpa.Compatibility</literal>
property <literal>CheckDatabaseForCascadePersistToDetachedEntity</literal>
to <literal>true</literal>.
</para>
</section>
<section id="jpa_2.2_LifecycleEventManager">
<title>
Life Cycle Event Manager Callback Behavior
</title>
<!-- See OPENJPA-2163 for details. -->
<para>
Life cycle event manager is used to manage entity's life cycle event callback.
In previous releases, Life cycle event manager is scoped to EntityManagerFactory.
This means listeners registered to an individual EntityManager may get life cycle
event callbacks for entity that it does not manage.
</para>
<para>
From 2.2.1 release, the default callback behavior of the life cycle event manager
is changed to scope to each EntityManager.
To revert this behavior to the previous release, set the
value of the <literal>openjpa.Compatibility</literal>
property <literal>SingletonLifecycleEventManager</literal>
to <literal>true</literal>.
</para>
</section>
<section id="jpa_2.2_sharedCacheMode">
<title>
shared-cache-mode Property
</title>
<!-- See OPENJPA-1532 for details. -->
<para>
In the previous release, when the shared-cache-mode is enabled and the DataCache property is not set
or set to false, there will be no data caching.
</para>
<para>
From 2.2.2 release, the caching will be turned on if the shared-cache-mode is enabled. Please see the
details described in section <xref linkend="ref_guide_shared_cache_mode_integration"/>.
</para>
</section>
</section>
</section>
<section id="jpa_2.3">
<title>
OpenJPA 2.3.0
</title>
<section id="jpa_2.3_incompatibilities">
<title>Incompatibilities</title>
<para>
The following sections indicate changes that are incompatible
between OpenJPA 2.2.x releases and the 2.3.0 release.
</para>
<section id="jpa_2.3_MappingTool">
<title>
MappingTool Behavior for DB2 and Derby
</title>
<para>
In previous releases, the MappingTool mapped <literal>java.math.BigDecimal</literal> fields to the database type
DOUBLE, and as such, ignored <literal>column</literal> and <literal>precision</literal> values that might have been specified via the
<literal>javax.persistence.Column</literal> annotation.
</para>
<para>
From the 2.3.0 release, <literal>java.math.BigDecimal</literal> fields are now mapped to the database type DECIMAL
and it is very likely that you will need to specify <literal>column</literal> and <literal>precision</literal> via
the <literal>javax.persistence.Column</literal> annotation.
</para>
</section>
<section id="jpa_2.3_RequiresSearchStringEscapeForLike">
<title>
RequiresSearchStringEscapeForLike DBDictionary Property
</title>
<!-- See OPENJPA-2282 for details. -->
<para>
In previous releases, the default value for the property RequiresSearchStringEscapeForLike is true and caused the
unexpected escape clause appended to the SQL statement.
For example, user created a named query like this:
<programlisting> SELECT o.computerName FROM CompUser o WHERE o.name LIKE ?</programlisting>
At run time the following query is generated:
<programlisting> SELECT t0.computerName FROM CompUser t0 WHERE (t0.name LIKE ? ESCAPE '\')</programlisting>
ESCAPE '\' shouldn't be appended to the query.
</para>
<para>
From the 2.3.0 release, RequiresSearchStringEscapeForLike property is set to false by default. You can configure
RequiresSearchStringEscapeForLike property to be true if the old behavior is desired.
</para>
</section>
<section id="ReturnNullOnEmptyAggregateResult">
<title>
Return value of aggregate functions in SELECT clause
</title>
<!-- See OPENJPA-1794 for details. -->
<para>
The JPA specification states "If SUM, AVG, MAX, or MIN is used, and there are no values to which the aggregate function can be
applied, the result of the aggregate function is NULL." Prior to this update, OpenJPA incorrectly returned 0 for SUM, AVG, MIN,
and MAX when a state field being aggregated is numeric. This behavior affects both JPQL and Criteria queries. With this update,
OpenJPA will return a null result value for these aggregate functions when a query returns no result.
</para>
<para>
To re-enable the prior behavior, you need to set the following persistence property in your persistence.xml or when
creating an EntityManagerFactory.
<programlisting>
&lt;property name="openjpa.Compatibility" value="ReturnNullOnAggregateResult=false"/&gt;
</programlisting>
</para>
</section>
</section>
</section>
<section id="jpa_3.2">
<title>OpenJPA 3.2.0</title>
<section id="jpa_3.2_incompatibilities">
<title>Incompatibilities</title>
<para>
The following sections indicate changes that are incompatible
between OpenJPA 3.1.x releases and the 3.2.0 release.
</para>
<section id="jpa_3.2_SumDouble">
<title>SUM now always returns Double</title>
<para>
We did fix the SUM operation to always return <classname>Double</classname> as requested by the spec.
Previously we did return whatever Numeric the JDBC driver did serve, resulting in non portable code.
</para>
</section>
<section id="jpa_3.2_InvalidColumnNames">
<title>Invalid Column Name Changes</title>
<para>
We did review and update the list of invalid column names for most <classname>DBDicationary</classname>.
The list of tested reserved words got enriched with previously forbidden column names to avoid backward
incompatibility issues.
The list can ge retrieved and configured via
<ulink url="../../apidocs/org/apache/openjpa/jdbc/sql/DBDictionary.html#getInvalidColumnWordSet()">
<methodname>DBDictionary.getInvalidColumnWordSet</methodname></ulink>
</para>
</section>
<section id="jpa_3.2_HsqlMappingTool">
<title>MappingTool Behavior for HSQLDB</title>
<para>
There have been 2 changes for Hypersonic (HSQLDB).
We fixed a bug which did cause <classname>long</classname> fields getting mapped to <literal>INTEGER</literal>
instead of <literal>BIGINT</literal>.
</para>
<para>
Java <classname>double</classname> fields previously got mapped to <literal>NUMERIC</literal> which
does lack fraction digits. Thus the value <literal>7.3425343</literal> got truncated to <literal>7</literal>.
We now map <classname>double</classname> fields in Entities to <literal>DOUBLE</literal> SQL column types.
</para>
</section>
<section id="jpa_3.2_OracleTimestampPrecision">
<title>Respect TIMESTAMP precision in Oracle</title>
<para>
Due to a bug we did hardcoded round at 3 digits precision.
So we essentially only allowed millis, even on a TIMESTAMP(6) field.
The new code does respect the second fractions and now defaults to 6.
It should be compatible but it might behave very subtle different.
</para>
</section>
<section id="jpa_3.2_UnaryOps">
<title>Unary Operations return types</title>
<para>
Before OpenJPA-3.2.0 Unary Operations like <literal>MIN</literal>, <literal>MAX</literal>, <literal>SUM</literal>, etc
did return whatever type got returned by the JDBC driver. For certain column types this could also have been internal
classes of that very JDBC driver. E.g. a <literal>SELECT MAX(a.someLocalDateField) ..</literal> might have returned
an instance of types <classname>com.oracle.jdbc....</classname> or <literal>com.microsoft.sqlserver...</literal>, etc.
We now use the respective <ulink url="../../apidocs/org/apache/openjpa/jdbc/sql/DBDictionary.html">
<methodname>DBDictionary</methodname></ulink> to request the correct type from the <classname>ResultSet</classname>.
</para>
</section>
<section id="jpa_3.2_PostgreSqlQueryTimeout">
<title>PostgreSQL now supports setQueryTimeOut</title>
<para>
PostgreSQL does now support client side setQueryTimeout.
User might see this come alive and now return different when the situation occurs.
This flag is automatically enabled if running against PostgreSQL 10 or later.
It can also be configured manually via
<ulink url="../../apidocs/org/apache/openjpa/jdbc/sql/DBDictionary.html#supportsQueryTimeout">
<fieldname>DBDictionary.supportsQueryTimeout</fieldname></ulink>
</para>
</section>
</section>
</section>
</appendix>