type=page
status=published
title=Using Container-Managed Persistence
next=java-clients.html
prev=ejb.html
~~~~~~

= Using Container-Managed Persistence

[[GSDVG00011]][[beajj]]


[[using-container-managed-persistence]]
== 9 Using Container-Managed Persistence

This chapter contains information on how EJB 2.1 container-managed
persistence (CMP) works in {productName}.

The following topics are addressed here:

* link:#beajk[{productName} Support for CMP]
* link:#beajl[CMP Mapping]
* link:#beajv[Automatic Schema Generation for CMP]
* link:#beajy[Schema Capture]
* link:#beakb[Configuring the CMP Resource]
* link:#beaki[Performance-Related Features]
* link:#beakc[Configuring Queries for 1.1 Finders]
* link:#beakm[CMP Restrictions and Optimizations]


[NOTE]
====
The Web Profile of the {productName} supports the EJB 3.1 Lite
specification, which allows enterprise beans within web applications,
among other features. The full {productName} supports the entire EJB
3.1 specification. For details, see
http://jcp.org/en/jsr/detail?id=318[JSR 318]
(`http://jcp.org/en/jsr/detail?id=318`).
====


[[beajk]][[GSDVG00150]][[glassfish-server-support-for-cmp]]

=== {productName} Support for CMP

{productName} support for EJB 2.1 CMP beans includes:

* Full support for the J2EE v1.4 specification's CMP model. Extensive
information on CMP is contained in chapters 10, 11, and 14 of the
Enterprise JavaBeans Specification, v2.1. This includes the following:

** Support for commit options B and C for transactions.
   See link:transaction-service.html#beajh[Commit Options].
** The primary key class must be a subclass of `java.lang.Object`.
   This ensures portability, and is noted because some vendors allow primitive
   types (such as `int`) to be used as the primary key class.

* The {productName} CMP implementation, which provides the following:
** An Object/Relational (O/R) mapping tool that creates XML deployment
   descriptors for EJB JAR files that contain beans that use CMP.
** Support for compound (multi-column) primary keys.
** Support for sophisticated custom finder methods.
** Standards-based query language (EJB QL).
** CMP runtime support. See link:#beakb[Configuring the CMP Resource].

* {productName} performance-related features, including the following:
** Version column consistency checking
** Relationship prefetching
** Read-Only Beans

+
For details, see link:#beaki[Performance-Related Features].

[[beajl]][[GSDVG00151]][[cmp-mapping]]

=== CMP Mapping

Implementation for entity beans that use CMP is mostly a matter of
mapping CMP fields and CMR fields (relationships) to the database.

The following topics are addressed here:

* link:#beajm[Mapping Capabilities]
* link:#beajn[The Mapping Deployment Descriptor File]
* link:#beajo[Mapping Considerations]

[[beajm]][[GSDVG00434]][[mapping-capabilities]]

==== Mapping Capabilities

Mapping refers to the ability to tie an object-based model to a
relational model of data, usually the schema of a relational database.
The CMP implementation provides the ability to tie a set of interrelated
beans containing data and associated behaviors to the schema. This
object representation of the database becomes part of the Java
application. You can also customize this mapping to optimize these beans
for the particular needs of an application. The result is a single data
model through which both persistent database information and regular
transient program data are accessed.

The mapping capabilities provided by the {productName} include:

* Mapping a CMP bean to one or more tables
* Mapping CMP fields to one or more columns
* Mapping CMP fields to different column types
* Mapping tables with compound primary keys
* Mapping tables with unknown primary keys
* Mapping CMP relationships to foreign keys
* Mapping tables with overlapping primary and foreign keys

[[beajn]][[GSDVG00435]][[the-mapping-deployment-descriptor-file]]

==== The Mapping Deployment Descriptor File

Each module with CMP beans must have the following files:

* `ejb-jar.xml` - The J2EE standard file for assembling enterprise
beans. For a detailed description, see the Enterprise JavaBeans
Specification, v2.1.
* `glassfish-ejb-jar.xml` - The {productName} standard file for
assembling enterprise beans. For a detailed description, see
"link:application-deployment-guide/dd-files.html#GSDPG00079[The glassfish-ejb-jar.xml File]" in {productName} Application Deployment Guide.
* `sun-cmp-mappings.xml` - The mapping deployment descriptor file, which
describes the mapping of CMP beans to tables in a database. For a
detailed description, see "link:application-deployment-guide/dd-files.html#GSDPG00080[The sun-cmp-mappings.xml
File]" in {productName} Application Deployment
Guide.

The `sun-cmp-mappings.xml` file can be automatically generated and does
not have to exist prior to deployment. For details, see
link:#beajx[Generation Options for CMP].

The `sun-cmp-mappings.xml` file maps CMP fields and CMR fields
(relationships) to the database. A primary table must be selected for
each CMP bean, and optionally, multiple secondary tables. CMP fields are
mapped to columns in either the primary or secondary table(s). CMR
fields are mapped to pairs of column lists (normally, column lists are
the lists of columns associated with primary and foreign keys).


[NOTE]
====
Table names in databases can be case-sensitive. Make sure that the table
names in the `sun-cmp-mappings.xml` file match the names in the
database.

Relationships should always be mapped to the primary key field(s) of the
related table.
====


The `sun-cmp-mappings.xml` file conforms to the
`sun-cmp-mapping_1_2.dtd` file and is packaged with the user-defined
bean classes in the EJB JAR file under the `META-INF` directory.

The {productName} creates the mappings in the `sun-cmp-mappings.xml`
file automatically during deployment if the file is not present.

To map the fields and relationships of your entity beans manually, edit
the `sun-cmp-mappings.xml` deployment descriptor. Only do this if you
are proficient in editing XML.

The mapping information is developed in conjunction with the database
schema (`.dbschema`) file, which can be automatically captured when you
deploy the bean (see link:#beajz[Automatic Database Schema Capture]).
You can manually generate the schema using the `capture-schema` utility
(link:#beaka[Using the `capture-schema` Utility]).

[[beajo]][[GSDVG00436]][[mapping-considerations]]

==== Mapping Considerations

The following topics are addressed here:

* link:#beajp[Join Tables and Relationships]
* link:#beajq[Automatic Primary Key Generation]
* link:#beajr[Fixed Length CHAR Primary Keys]
* link:#beajs[Managed Fields]
* link:#beajt[BLOB Support]
* link:#beaju[CLOB Support]

The data types used in automatic schema generation are also suggested
for manual mapping. These data types are described in
link:#beajw[Supported Data Types for CMP].

[[beajp]][[GSDVG00303]][[join-tables-and-relationships]]

===== Join Tables and Relationships

Use of join tables in the database schema is supported for all types of
relationships, not just many-to-many relationships. For general
information about relationships, see section 10.3.7 of the Enterprise
JavaBeans Specification, v2.1.

[[beajq]][[GSDVG00304]][[automatic-primary-key-generation]]

===== Automatic Primary Key Generation

The {productName} supports automatic primary key generation for EJB
1.1, 2.0, and 2.1 CMP beans. To specify automatic primary key
generation, give the `prim-key-class` element in the `ejb-jar.xml` file
the value `java.lang.Object`. CMP beans with automatically generated
primary keys can participate in relationships with other CMP beans. The
{productName} does not support database-generated primary key values.

If the database schema is created during deployment, the {productName} creates the schema with the primary key column, then generates
unique values for the primary key column at runtime.

If the database schema is not created during deployment, the primary key
column in the mapped table must be of type `NUMERIC` with a precision of
19 or more, and must not be mapped to any CMP field. The {productName} generates unique values for the primary key column at runtime.

[[beajr]][[GSDVG00305]][[fixed-length-char-primary-keys]]

===== Fixed Length CHAR Primary Keys

If an existing database table has a primary key column in which the
values vary in length, but the type is `CHAR` instead of `VARCHAR`, the
{productName} automatically trims any extra spaces when retrieving
primary key values. It is not a good practice to use a fixed length
`CHAR` column as a primary key. Use this feature with schemas that
cannot be changed, such as a schema inherited from a legacy application.

[[beajs]][[GSDVG00306]][[managed-fields]]

===== Managed Fields

A managed field is a CMP or CMR field that is mapped to the same
database column as another CMP or CMR field. CMP fields mapped to the
same column and CMR fields mapped to exactly the same column lists
always have the same value in memory. For CMR fields that share only a
subset of their mapped columns, changes to the columns affect the
relationship fields in memory differently. Basically, the {productName} always tries to keep the state of the objects in memory
synchronized with the database.

A managed field can have any `fetched-with` subelement. If the
`fetched-with` subelement is `<default/>`, the
`-DAllowManagedFieldsInDefaultFetchGroup` flag must be set to `true`.
See link:#gemln[Default Fetch Group Flags] and
"link:application-deployment-guide/dd-elements.html#GSDPG00153[fetched-with]" in {productName}
Application Deployment Guide.

[[beajt]][[GSDVG00307]][[blob-support]]

===== BLOB Support

Binary Large Object (BLOB) is a data type used to store values that do
not correspond to other types such as numbers, strings, or dates. Java
fields whose types implement java.io.Serializable or are represented as
`byte[]` can be stored as BLOBs.

If a CMP field is defined as Serializable, it is serialized into a
`byte[]` before being stored in the database. Similarly, the value
fetched from the database is deserialized. However, if a CMP field is
defined as `byte[]`, it is stored directly instead of being serialized
and deserialized when stored and fetched, respectively.

To enable BLOB support in the {productName} environment, define a CMP
field of type `byte[]` or a user-defined type that implements the
java.io.Serializable interface. If you map the CMP bean to an existing
database schema, map the field to a column of type BLOB.

To use BLOB or CLOB data types larger than 4 KB for CMP using the Inet
Oraxo JDBC Driver for Oracle Databases, you must set the `streamstolob`
property value to `true`.

For a list of the JDBC drivers currently supported by the {productName}, see the link:release-notes.html#GSRLN[{productName} Release
Notes]. For configurations of supported and other drivers, see
"link:administration-guide/jdbc.html#GSADG00579[Configuration Specifics for JDBC Drivers]" in
{productName} Administration Guide.

For automatic mapping, you might need to change the default BLOB column
length for the generated schema using the `schema-generator-properties`
element in `glassfish-ejb-jar.xml`. See your database vendor
documentation to determine whether you need to specify the length. For
example:

[source,xml]
----
<schema-generator-properties>
   <property>
      <name>Employee.voiceGreeting.jdbc-type</name>
      <value>BLOB</value>
   </property>
   <property>
      <name>Employee.voiceGreeting.jdbc-maximum-length</name>
      <value>10240</value>
   </property>
   ...
</schema-generator-properties>
----

[[beaju]][[GSDVG00308]][[clob-support]]

===== CLOB Support

Character Large Object (CLOB) is a data type used to store and retrieve
very long text fields. CLOBs translate into long strings.

To enable CLOB support in the {productName} environment, define a CMP
field of type `java.lang.String`. If you map the CMP bean to an existing
database schema, map the field to a column of type CLOB.

To use BLOB or CLOB data types larger than 4 KB for CMP using the Inet
Oraxo JDBC Driver for Oracle Databases, you must set the `streamstolob`
property value to `true`.

For a list of the JDBC drivers currently supported by the {productName}, see the link:release-notes.html#GSRLN[{productName} Release
Notes]. For configurations of supported and other drivers, see
"link:administration-guide/jdbc.html#GSADG00579[Configuration Specifics for JDBC Drivers]" in
{productName} Administration Guide.

For automatic mapping, you might need to change the default CLOB column
length for the generated schema using the `schema-generator-properties`
element in `glassfish-ejb-jar.xml`. See your database vendor
documentation to determine whether you need to specify the length. For
example:

[source,xml]
----
<schema-generator-properties>
   <property>
      <name>Employee.resume.jdbc-type</name>
      <value>CLOB</value>
   </property>
   <property>
      <name>Employee.resume.jdbc-maximum-length</name>
      <value>10240</value>
   </property>
   ...
</schema-generator-properties>
----

[[beajv]][[GSDVG00152]][[automatic-schema-generation-for-cmp]]

=== Automatic Schema Generation for CMP

The automatic schema generation feature provided in the {productName}
defines database tables based on the fields in entity beans and the
relationships between the fields. This insulates developers from many of
the database related aspects of development, allowing them to focus on
entity bean development. The resulting schema is usable as-is or can be
given to a database administrator for tuning with respect to
performance, security, and so on.

The following topics are addressed here:

* link:#beajw[Supported Data Types for CMP]
* link:#beajx[Generation Options for CMP]


[NOTE]
====
Automatic schema generation is supported on an all-or-none basis: it
expects that no tables exist in the database before it is executed. It
is not intended to be used as a tool to generate extra tables or
constraints.

Deployment won't fail if all tables are not created, and undeployment
won't fail if not all tables are dropped. This is done to allow you to
investigate the problem and fix it manually. You should not rely on the
partially created database schema to be correct for running the
application.
====


[[beajw]][[GSDVG00437]][[supported-data-types-for-cmp]]

==== Supported Data Types for CMP

CMP supports a set of JDBC data types that are used in mapping Java data
fields to SQL types. Supported JDBC data types are as follows: BIGINT,
BIT, BLOB, CHAR, CLOB, DATE, DECIMAL, DOUBLE, FLOAT, INTEGER, NUMERIC,
REAL, SMALLINT, TIME, TIMESTAMP, TINYINT, VARCHAR.

The following table contains the mappings of Java types to JDBC types
when automatic mapping is used.

[[GSDVG550]][[sthref19]][[fvyaq]]


Table 9-1 Java Type to JDBC Type Mappings for CMP

[width="100%",cols="39%,40%,21%",options="header",]
|===
|Java Type |JDBC Type |Nullability
|`boolean` |`BIT` |No
|`java.lang.Boolean` |`BIT` |Yes
|`byte` |`TINYINT` |No
|`java.lang.Byte` |`TINYINT` |Yes
|`double` |`DOUBLE` |No
|`java.lang.Double` |`DOUBLE` |Yes
|`float` |`REAL` |No
|`java.lang.Float` |`REAL` |Yes
|`int` |`INTEGER` |No
|`java.lang.Integer` |`INTEGER` |Yes
|`long` |`BIGINT` |No
|`java.lang.Long` |`BIGINT` |Yes
|`short` |`SMALLINT` |No
|`java.lang.Short` |`SMALLINT` |Yes
|`java.math.BigDecimal` |`DECIMAL` |Yes
|`java.math.BigInteger` |`DECIMAL` |Yes
|`char` |`CHAR` |No
|`java.lang.Character` |`CHAR` |Yes
|`java.lang.String` |`VARCHAR` or `CLOB` |Yes
|Serializable |`BLOB` |Yes
|`byte[]` |`BLOB` |Yes
|`java.util.Date` a|
`DATE` (Oracle only)

`TIMESTAMP` (all other databases)

 |Yes
|`java.sql.Date` |`DATE` |Yes
|`java.sql.Time` |`TIME` |Yes
|`java.sql.Timestamp` |`TIMESTAMP` |Yes
|===



[NOTE]
====
Java types assigned to CMP fields must be restricted to Java primitive
types, Java Serializable types, `java.util.Date`, `java.sql.Date`,
`java.sql.Time`, or `java.sql.Timestamp`. An entity bean local interface
type (or a collection of such) can be the type of a CMR field.
====


The following table contains the mappings of JDBC types to database
vendor-specific types when automatic mapping is used. For a list of the
JDBC drivers currently supported by the {productName}, see the
link:release-notes.html#GSRLN[{productName} Release Notes]. For
configurations of supported and other drivers, see
"link:administration-guide/jdbc.html#GSADG00579[Configuration Specifics for JDBC Drivers]" in
{productName} Administration Guide.

[[GSDVG551]][[sthref20]][[fvymp]]


Table 9-2 Mappings of JDBC Types to Database Vendor Specific Types for
CMP

[width="100%",cols="15%,17%,17%,17%,17%,17%",options="header",]
|===
|JDBC Type |Apache Derby, CloudScape |Oracle |DB2 |Sybase ASE 12.5
|MS-SQL Server
|`BIT` |`SMALLINT` |`SMALLINT` |`SMALLINT` |`TINYINT` |`BIT`

|`TINYINT` |`SMALLINT` |`SMALLINT` |`SMALLINT` |`TINYINT` |`TINYINT`

|`SMALLINT` |`SMALLINT` |`SMALLINT` |`SMALLINT` |`SMALLINT` |`SMALLINT`

|`INTEGER` |`INTEGER` |`INTEGER` |`INTEGER` |`INTEGER` |`INTEGER`

|`BIGINT` |`BIGINT` |`NUMBER` |`BIGINT` |`NUMERIC` |`NUMERIC`

|`REAL` |`REAL` |`REAL` |`FLOAT` |`FLOAT` |`REAL`

|`DOUBLE` |`DOUBLE PRECISION` |`DOUBLE PRECISION` |`DOUBLE`
|`DOUBLE PRECISION` |`FLOAT`

|`DECIMAL(p,s)` |`DECIMAL(p,s)` |`NUMBER(p,s)` |`DECIMAL(p,s)`
|`DECIMAL(p,s)` |`DECIMAL(p,s)`

|`VARCHAR` |`VARCHAR` |`VARCHAR2` |`VARCHAR` |`VARCHAR` |`VARCHAR`

|`DATE` |`DATE` |`DATE` |`DATE` |`DATETIME` |`DATETIME`

|`TIME` |`TIME` |`DATE` |`TIME` |`DATETIME` |`DATETIME`

|`TIMESTAMP` |`TIMESTAMP` |`TIMESTAMP(9)` |`TIMESTAMP` |`DATETIME`
|`DATETIME`

|`BLOB` |`BLOB` |`BLOB` |`BLOB` |`IMAGE` |`IMAGE`

|`CLOB` |`CLOB` |`CLOB` |`CLOB` |`TEXT` |`NTEXT`
|===


[[beajx]][[GSDVG00438]][[generation-options-for-cmp]]

==== Generation Options for CMP

Deployment descriptor elements or `asadmin` command line options can
control automatic schema generation by the following:

* Creating tables during deployment
* Dropping tables during undeployment
* Dropping and creating tables during redeployment
* Specifying the database vendor
* Specifying that table names are unique
* Specifying type mappings for individual CMP fields


[NOTE]
====
Before using these options, make sure you have a properly configured CMP
resource. See link:#beakb[Configuring the CMP Resource].

For a read-only bean, do not create the database schema during
deployment. Instead, work with your database administrator to populate
the data into the tables. See link:ejb.html#beail[Using Read-Only Beans].

Automatic schema generation is not supported for beans with version
column consistency checking. Instead, work with your database
administrator to create the schema and add the required triggers. See
link:#beakj[Version Column Consistency Checking].
====


The following optional data subelements of the `cmp-resource` element in
the `glassfish-ejb-jar.xml` file control the automatic creation of
database tables at deployment. For more information about the
`cmp-resource` element, see "link:application-deployment-guide/dd-elements.html#GSDPG00115[cmp-resource]" in
{productName} Application Deployment Guide and
link:#beakb[Configuring the CMP Resource].

[[GSDVG552]][[sthref21]][[fvymo]]


Table 9-3 The `glassfish-ejb-jar.xml` Generation Elements

[width="172%",cols="20%,46%,34%",options="header",]
|===
|Element |Default |Description
|link:application-deployment-guide/dd-elements.html#GSDPG00131[`create-tables-at-deploy`] |`false` |If `true`, causes
database tables to be created for beans that are automatically mapped by
the EJB container. No unique constraints are created. If `false`, does
not create tables.

|link:application-deployment-guide/dd-elements.html#GSDPG00141[`drop-tables-at-undeploy`] |`false` |If `true`, causes
database tables that were automatically created when the bean(s) were
last deployed to be dropped when the bean(s) are undeployed. If `false`,
does not drop tables.

|link:application-deployment-guide/dd-elements.html#GSDPG00133[`database-vendor-name`] |none a|
Specifies the name of the database vendor for which tables are created.
Allowed values are `javadb`, `db2`, `mssql`, `mysql`, `oracle`,
`postgresql`, `pointbase`, `derby` (also for CloudScape), and `sybase`,
case-insensitive.

If no value is specified, a connection is made to the resource specified
by the `jndi-name` subelement of the `cmp-resource` element in the
`glassfish-ejb-jar.xml` file, and the database vendor name is read. If
the connection cannot be established, or if the value is not recognized,
SQL-92 compliance is presumed.

|link:application-deployment-guide/dd-elements.html#GSDPG00261[`schema-generator-properties`] |none a|
Specifies field-specific column attributes in `property` subelements.
Each property name is of the following format:

bean-name`.`field-name`.`attribute

For example:

`Employee.firstName.jdbc-type`

Also allows you to set the `use-unique-table-names` property. If `true`,
this property specifies that generated table names are unique within
each {productName} domain. The default is `false`.

For further information and an example, see
"link:application-deployment-guide/dd-elements.html#GSDPG00261[schema-generator-properties]" in {productName} Application Deployment Guide.

|===


The following options of the `asadmin deploy` or `asadmin deploydir`
command control the automatic creation of database tables at deployment.

[[GSDVG553]][[sthref22]][[fvymn]]


Table 9-4 The `asadmin deploy` and `asadmin deploydir` Generation
Options for CMP

[width="172%",cols="16%,46%,38%",options="header",]
|===
|Option |Default |Description
|`--createtables` |none |If `true`, causes database tables to be created
for beans that need them. No unique constraints are created. If `false`,
does not create tables. If not specified, the value of the
`create-tables-at-deploy` attribute in `glassfish-ejb-jar.xml` is used.

|`--dropandcreatetables` |none a|
If `true`, and if tables were automatically created when this
application was last deployed, tables from the earlier deployment are
dropped and fresh ones are created.

If `true`, and if tables were not automatically created when this
application was last deployed, no attempt is made to drop any tables. If
tables with the same names as those that would have been automatically
created are found, the deployment proceeds, but a warning indicates that
tables could not be created.

If `false`, settings of `create-tables-at-deploy` or
`drop-tables-at-undeploy` in the `glassfish-ejb-jar.xml` file are
overridden.

|`--uniquetablenames` |none |If `true`, specifies that table names are
unique within each {productName} domain. If not specified, the value
of the `use-unique-table-names` property in `glassfish-ejb-jar.xml` is
used.

|`--dbvendorname` |none a|
Specifies the name of the database vendor for which tables are created.
Allowed values are `javadb`, `db2`, `mssql`, `oracle`, `postgresql`,
`pointbase`, `derby` (also for CloudScape), and `sybase`,
case-insensitive.

If not specified, the value of the `database-vendor-name` attribute in
`glassfish-ejb-jar.xml` is used.

If no value is specified, a connection is made to the resource specified
by the `jndi-name` subelement of the `cmp-resource` element in the
`glassfish-ejb-jar.xml` file, and the database vendor name is read. If
the connection cannot be established, or if the value is not recognized,
SQL-92 compliance is presumed.

|===


If one or more of the beans in the module are manually mapped and you
use any of the `asadmin deploy` or `asadmin deploydir` options, the
deployment is not harmed in any way, but the options have no effect, and
a warning is written to the server log.

The following options of the `asadmin undeploy` command control the
automatic removal of database tables at undeployment.

[[GSDVG554]][[sthref23]][[fvymt]]


Table 9-5 The `asadmin undeploy` Generation Options for CMP

[width="172%",cols="10%,46%,44%",options="header",]
|===
|Option |Default |Description
|`--droptables` |none a|
If `true`, causes database tables that were automatically created when
the bean(s) were last deployed to be dropped when the bean(s) are
undeployed. If `false`, does not drop tables.

If not specified, the value of the `drop-tables-at-undeploy` attribute
in `glassfish-ejb-jar.xml` is used.

|===


For more information about the `asadmin deploy`, `asadmin deploydir`,
and `asadmin undeploy` commands, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].

When command line and `glassfish-ejb-jar.xml` options are both
specified, the `asadmin` options take precedence.

[[beajy]][[GSDVG00153]][[schema-capture]]

=== Schema Capture

The following topics are addressed here:

* link:#beajz[Automatic Database Schema Capture]
* link:#beaka[Using the `capture-schema` Utility]

[[beajz]][[GSDVG00439]][[automatic-database-schema-capture]]

==== Automatic Database Schema Capture

You can configure a CMP bean in {productName} to automatically
capture the database metadata and save it in a `.dbschema` file during
deployment. If the `sun-cmp-mappings.xml` file contains an empty
`<schema/>` entry, the `cmp-resource` entry in the
`glassfish-ejb-jar.xml` file is used to get a connection to the
database, and automatic generation of the schema is performed.


[NOTE]
====
Before capturing the database schema automatically, make sure you have a
properly configured CMP resource. See link:#beakb[Configuring the CMP
Resource].
====


[[beaka]][[GSDVG00440]][[using-the-capture-schema-utility]]

==== Using the `capture-schema` Utility

You can use the `capture-schema` command to manually generate the
database metadata (`.dbschema`) file. For details, see the
link:reference-manual.html#GSRFM[{productName} Reference Manual].

The `capture-schema` utility does not modify the schema in any way. Its
only purpose is to provide the persistence engine with information about
the structure of the database (the schema).

Keep the following in mind when using the `capture-schema` command:

* The name of a `.dbschema` file must be unique across all deployed
modules in a domain.
* If more than one schema is accessible for the schema user, more than
one table with the same name might be captured if the `-schemaname`
option of `capture-schema` is not set.
* The schema name must be upper case.
* Table names in databases are case-sensitive. Make sure that the table
name matches the name in the database.
* PostgreSQL databases internally convert all names to lower case.
Before running the `capture-schema` command on a PostgreSQL database,
make sure table and column names are lower case in the
`sun-cmp-mappings.xml` file.
* An Oracle database user running the `capture-schema` command needs
ANALYZE ANY TABLE privileges if that user does not own the schema. These
privileges are granted to the user by the database administrator.

[[beakb]][[GSDVG00154]][[configuring-the-cmp-resource]]

=== Configuring the CMP Resource

An EJB module that contains CMP beans requires the JNDI name of a JDBC
resource in the `jndi-name` subelement of the `cmp-resource` element in
the `glassfish-ejb-jar.xml` file. Set `PersistenceManagerFactory`
properties as properties of the `cmp-resource` element in the
`glassfish-ejb-jar.xml` file. See "link:application-deployment-guide/dd-elements.html#GSDPG00115[cmp-resource]" in
{productName} Application Deployment Guide.

In the Administration Console, open the Resources component, then select
JDBC. Click the Help button in the Administration Console for
information on creating a new JDBC resource.

For a list of the JDBC drivers currently supported by the {productName}, see the link:release-notes.html#GSRLN[{productName} Release
Notes]. For configurations of supported and other drivers, see
"link:administration-guide/jdbc.html#GSADG00579[Configuration Specifics for JDBC Drivers]" in
{productName} Administration Guide.

For example, if the JDBC resource has the JNDI name `jdbc/MyDatabase`,
set the CMP resource in the `glassfish-ejb-jar.xml` file as follows:

[source,xml]
----
<cmp-resource>
   <jndi-name>jdbc/MyDatabase</jndi-name>
</cmp-resource>
----

[[beaki]][[GSDVG00155]][[performance-related-features]]

=== Performance-Related Features

The {productName} provides the following features to enhance
performance or allow more fine-grained data checking. These features are
supported only for entity beans with container managed persistence.

The following topics are addressed here:

* link:#beakj[Version Column Consistency Checking]
* link:#beakk[Relationship Prefetching]
* link:#beakl[Read-Only Beans]
* link:#gemln[Default Fetch Group Flags]


[NOTE]
====
Use of any of these features results in a non-portable application.
====


[[beakj]][[GSDVG00441]][[version-column-consistency-checking]]

==== Version Column Consistency Checking

The version consistency feature saves the bean state at first
transactional access and caches it between transactions. The state is
copied from the cache instead of being read from the database. The bean
state is verified by primary key and version column values at flush for
custom queries (for dirty instances only) and at commit (for clean and
dirty instances).

[[fwbei]][[GSDVG00071]][[to-use-version-consistency]]

===== To Use Version Consistency

1. Create the version column in the primary table.
2. Give the version column a numeric data type.
3. Provide appropriate update triggers on the version column. +
These triggers must increment the version column on each update of the
specified row.
4. Specify the version column. +
This is specified in the `check-version-of-accessed-instances`
subelement of the `consistency` element in the `sun-cmp-mappings.xml`
file. See "link:application-deployment-guide/dd-elements.html#GSDPG00126[consistency]" in {productName} Application Deployment Guide.
5. Map the CMP bean to an existing schema.
+
Automatic schema generation is not supported for beans with version
column consistency checking. Instead, work with your database
administrator to create the schema and add the required triggers.

[[beakk]][[GSDVG00442]][[relationship-prefetching]]

==== Relationship Prefetching

In many cases when an entity bean's state is fetched from the database,
its relationship fields are always accessed in the same transaction.
Relationship prefetching saves database round trips by fetching data for
an entity bean and those beans referenced by its CMR fields in a single
database round trip.

To enable relationship prefetching for a CMR field, use the `default`
subelement of the `fetched-with` element in the `sun-cmp-mappings.xml`
file. By default, these CMR fields are prefetched whenever
`findByPrimaryKey` or a custom finder is executed for the entity, or
when the entity is navigated to from a relationship. (Recursive
prefetching is not supported, because it does not usually enhance
performance.) See "link:application-deployment-guide/dd-elements.html#GSDPG00153[fetched-with]" in {productName} Application Deployment Guide.

To disable prefetching for specific custom finders, use the
`prefetch-disabled` element in the `glassfish-ejb-jar.xml` file. See
"link:application-deployment-guide/dd-elements.html#GSDPG00226[prefetch-disabled]" in {productName} Application Deployment Guide.

Multilevel relationship prefetching is supported for CMP 2.1 entity
beans. To enable multilevel relationship prefetching, set the following
property using the `asadmin create-jvm-options` command:

[source]
----
asadmin create-jvm-options -Dcom.sun.jdo.spi.persistence.support.sqlstore.MULTILEVEL_PREFETCH=true
----

[[beakl]][[GSDVG00443]][[read-only-beans]]

==== Read-Only Beans

Another feature that the {productName} provides is the read-only
bean, an entity bean that is never modified by an EJB client. Read-only
beans avoid database updates completely.


[NOTE]
====
Read-only beans are specific to the {productName} and are not part of
the Enterprise JavaBeans Specification, v2.1. Use of this feature for an
EJB 2.1 bean results in a non-portable application.
====


A read-only bean can be used to cache a database entry that is
frequently accessed but rarely updated (externally by other beans). When
the data that is cached by a read-only bean is updated by another bean,
the read-only bean can be notified to refresh its cached data.

The {productName} provides a number of ways by which a read-only
bean's state can be refreshed. By setting the
`refresh-period-in-seconds` element in the `glassfish-ejb-jar.xml` file
and the `trans-attribute` element (or `@TransactionAttribute`
annotation) in the `ejb-jar.xml` file, it is easy to configure a
read-only bean that is one of the following:

* Always refreshed
* Periodically refreshed
* Never refreshed
* Programmatically refreshed

Access to CMR fields of read-only beans is not supported. Deployment
will succeed, but an exception will be thrown at runtime if a get or set
method is invoked.

Read-only beans are best suited for situations where the underlying data
never changes, or changes infrequently. For further information and
usage guidelines, see link:ejb.html#beail[Using Read-Only Beans].

[[gemln]][[GSDVG00156]][[default-fetch-group-flags]]

=== Default Fetch Group Flags

Using the following flags can improve performance.

Setting `-DAllowManagedFieldsInDefaultFetchGroup=true` allows CMP fields
that by default cannot be placed into the default fetch group to be
loaded along with all other fields that are fetched when the CMP state
is loaded into memory. These could be multiple fields mapped to the same
column in the database table, for example, an instance field and a CMR.
By default this flag is set to `false`.

For additional information, see "link:application-deployment-guide/dd-elements.html#GSDPG00181[level]" in {productName} Application Deployment Guide.

Setting `-DAllowMediatedWriteInDefaultFetchGroup` specifies how updated
CMP fields are written back to the database. If the flag is `false`, all
fields in the CMP bean are written back to the database if at least one
field in the default fetch group has been changed in a transaction. If
the flag is `true`, only fields modified by the bean are written back to
the database. Specifying `true` can improve performance, particularly on
database tables with many columns that have not been updated. By default
this flag is set to `false`.

To set one of these flags, use the `asadmin create-jvm-options` command.
For example:

[source]
----
asadmin create-jvm-options -DAllowManagedFieldsInDefaultFetchGroup=true
----

[[beakc]][[GSDVG00157]][[configuring-queries-for-1.1-finders]]

=== Configuring Queries for 1.1 Finders

The following topics are addressed here:

* link:#ganjq[About JDOQL Queries]
* link:#gankm[Query Filter Expression]
* link:#ganjt[Query Parameters]
* link:#ganky[Query Variables]
* link:#ganla[JDOQL Examples]

[[ganjq]][[GSDVG00444]][[about-jdoql-queries]]

==== About JDOQL Queries

The Enterprise JavaBeans Specification, v1.1 does not specify the format
of the finder method description. The {productName} uses an extension
of Java Data Objects Query Language (JDOQL) queries to implement finder
and selector methods. You can specify the following elements of the
underlying JDOQL query:

* Filter expression - A Java-like expression that specifies a condition
that each object returned by the query must satisfy. Corresponds to the
WHERE clause in EJB QL.
* Query parameter declaration - Specifies the name and the type of one
or more query input parameters. Follows the syntax for formal parameters
in the Java language.
* Query variable declaration - Specifies the name and type of one or
more query variables. Follows the syntax for local variables in the Java
language. A query filter might use query variables to implement joins.
* Query ordering declaration - Specifies the ordering expression of the
query. Corresponds to the ORDER BY clause of EJB QL.

The {productName} specific deployment descriptor
(`glassfish-ejb-jar.xml`) provides the following elements to store the
EJB 1.1 finder method settings:

[source]
----
query-filter
query-params
query-variables
query-ordering
----

The bean developer uses these elements to construct a query. When the
finder method that uses these elements executes, the values of these
elements are used to execute a query in the database. The objects from
the JDOQL query result set are converted into primary key instances to
be returned by the EJB 1.1 `ejbFind` method.

The JDO specification, http://jcp.org/en/jsr/detail?id=12[JSR 12]
(`http://jcp.org/en/jsr/detail?id=12`), provides a comprehensive
description of JDOQL. The following information summarizes the elements
used to define EJB 1.1 finders.

[[gankm]][[GSDVG00445]][[query-filter-expression]]

==== Query Filter Expression

The filter expression is a String containing a Boolean expression
evaluated for each instance of the candidate class. If the filter is not
specified, it defaults to true. Rules for constructing valid expressions
follow the Java language, with the following differences:

* Equality and ordering comparisons between primitives and instances of
wrapper classes are valid.
* Equality and ordering comparisons of Date fields and Date parameters
are valid.
* Equality and ordering comparisons of String fields and String
parameters are valid.
* White space (non-printing characters space, tab, carriage return, and
line feed) is a separator and is otherwise ignored.
* The following assignment operators are not supported.

** Comparison operators such as =, +=, and so on

** Pre- and post-increment

** Pre- and post-decrement
* Methods, including object construction, are not supported, except for
these methods.
+
[source,java]
----
Collection.contains(Object o)
Collection.isEmpty()
String.startsWith(String s)
String.endsWith(String e)
----
In addition, the {productName} supports the following nonstandard
JDOQL methods.
+
[source,java]
----
String.like(String pattern)
String.like(String pattern, char escape)
String.substring(int start, int length)
String.indexOf(String str)
String.indexOf(String str, int start)
String.length()
Math.abs(numeric n)
Math.sqrt(double d)
----
* Navigation through a null-valued field, which throws a
`NullPointerException`, is treated as if the sub-expression returned
`false`.


[NOTE]
====
Comparisons between floating point values are by nature inexact.
Therefore, equality comparisons (== and !=) with floating point values
should be used with caution. Identifiers in the expression are
considered to be in the name space of the candidate class, with the
addition of declared parameters and variables. As in the Java language,
`this` is a reserved word, and refers to the current instance being
evaluated.
====


The following expressions are supported.

* Relational operators (==, !=,>, <,>=, <=)
* Boolean operators (&, &&, |, ||, ~, !)
* Arithmetic operators (+, -, *, /)
* String concatenation, only for String + String
* Parentheses to explicitly mark operator precedence
* Cast operator
* Promotion of numeric operands for comparisons and arithmetic
operations

The rules for promotion follow the Java rules extended by BigDecimal,
BigInteger, and numeric wrapper classes. See the numeric promotions of
the Java language specification.

[[ganjt]][[GSDVG00446]][[query-parameters]]

==== Query Parameters

The parameter declaration is a String containing one or more parameter
type declarations separated by commas. This follows the Java syntax for
method signatures.

[[ganky]][[GSDVG00447]][[query-variables]]

==== Query Variables

The type declarations follow the Java syntax for local variable
declarations.

[[ganla]][[GSDVG00448]][[jdoql-examples]]

==== JDOQL Examples

This section provides a few query examples.

[[gankk]][[GSDVG00309]][[example-1]]

===== Example 1

The following query returns all players called Michael. It defines a
filter that compares the name field with a string literal:

[source,java]
----
name == "Michael"
----

The `finder` element of the `glassfish-ejb-jar.xml` file looks like
this:

[source,xml]
----
<finder>
   <method-name>findPlayerByName</method-name>
   <query-filter>name == "Michael"</query-filter>
</finder>
----

[[ganjz]][[GSDVG00310]][[example-2]]

===== Example 2

This query returns all products in a specified price range. It defines
two query parameters which are the lower and upper bound for the price:
double low, double high. The filter compares the query parameters with
the price field:

[source,java]
----
low < price && price < high
----

Query ordering is set to `price ascending`.

The `finder` element of the `glassfish-ejb-jar.xml` file looks like
this:

[source,xml]
----
<finder>
   <method-name>findInRange</method-name>
   <query-params>double low, double high</query-params>
   <query-filter>low &lt; price &amp;&amp; price &lt high</query-filter>
   <query-ordering>price ascending</query-ordering>
</finder>
----

[[gankz]][[GSDVG00311]][[example-3]]

===== Example 3

This query returns all players having a higher salary than the player
with the specified name. It defines a query parameter for the name
`java.lang.String name`. Furthermore, it defines a variable to which the
player's salary is compared. It has the type of the persistence capable
class that corresponds to the bean:

[source]
----
    mypackage.PlayerEJB_170160966_JDOState player
----

The filter compares the salary of the current player denoted by the
`this` keyword with the salary of the player with the specified name:

[source,java]
----
    (this.salary> player.salary) && (player.name == name)
----

The `finder` element of the `glassfish-ejb-jar.xml` file looks like
this:

[source,xml]
----
<finder>
   <method-name>findByHigherSalary</method-name>
   <query-params>java.lang.String name</query-params>
   <query-filter>
      (this.salary &gt; player.salary) &amp;&amp; (player.name == name)
   </query-filter>
   <query-variables>
      mypackage.PlayerEJB_170160966_JDOState player
   </query-variables>
</finder>
----

[[beakm]][[GSDVG00158]][[cmp-restrictions-and-optimizations]]

=== CMP Restrictions and Optimizations

This section discusses restrictions and performance optimizations that
pertain to using CMP.

The following topics are addressed here:

* link:#gdtfj[Disabling ORDER BY Validation]
* link:#geprt[Setting the Heap Size on DB2]
* link:#beakn[Eager Loading of Field State]
* link:#beako[Restrictions on Remote Interfaces]
* link:#gcnto[PostgreSQL Case Insensitivity]
* link:#beakr[No Support for `lock-when-loaded` on Sybase]
* link:#beakp[Sybase Finder Limitation]
* link:#beakq[Date and Time Fields]
* link:#beaks[Set `RECURSIVE_TRIGGERS` to `false` on MSSQL]
* link:#gbhbr[MySQL Database Restrictions]

[[gdtfj]][[GSDVG00449]][[disabling-order-by-validation]]

==== Disabling ORDER BY Validation

EJB QL as defined in the EJB 2.1 Specification defines certain
restrictions for the SELECT clause of an ORDER BY query (see section
11.2.8 ORDER BY Clause). This ensures that a query does not order by a
field that is not returned by the query. By default, the EJB QL compiler
checks the above restriction and throws an exception if the query does
not conform.

However, some databases support SQL statements with an ORDER BY column
that is not included in the SELECT clause. To disable the validation of
the ORDER BY clause against the SELECT clause, set the
`DISABLE_ORDERBY_VALIDATION` JVM option as follows:

[source]
----
asadmin create-jvm-options
-Dcom.sun.jdo.spi.persistence.support.ejb.ejbqlc.DISABLE_ORDERBY_VALIDATION=true
----

The `DISABLE_ORDERBY_VALIDATION` option is set to `false` by default.
Setting it to `true` results in a non-portable module or application.

[[geprt]][[GSDVG00450]][[setting-the-heap-size-on-db2]]

==== Setting the Heap Size on DB2

On DB2, the database configuration parameter `APPLHEAPSZ` determines the
heap size. If you are using the Oracle or DataDirect database driver,
set this parameter to at least `2048` for CMP. For more information, see
`http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/opt/tsbp2024.html`.

[[beakn]][[GSDVG00451]][[eager-loading-of-field-state]]

==== Eager Loading of Field State

By default, the EJB container loads the state for all persistent fields
(excluding relationship, BLOB, and CLOB fields) before invoking the
`ejbLoad` method of the abstract bean. This approach might not be
optimal for entity objects with large state if most business methods
require access to only parts of the state.

Use the `fetched-with` element in `sun-cmp-mappings.xml` for fields that
are used infrequently. See "link:application-deployment-guide/dd-elements.html#GSDPG00153[fetched-with]" in {productName} Application Deployment Guide.

[[beako]][[GSDVG00452]][[restrictions-on-remote-interfaces]]

==== Restrictions on Remote Interfaces

The following restrictions apply to the remote interface of an EJB 2.1
bean that uses CMP:

* Do not expose the `get` and `set` methods for CMR fields or the
persistence collection classes that are used in container-managed
relationships through the remote interface of the bean.
+
However, you are free to expose the `get` and `set` methods that
correspond to the CMP fields of the entity bean through the bean's
remote interface.
* Do not expose the container-managed collection classes that are used
for relationships through the remote interface of the bean.
* Do not expose local interface types or local home interface types
through the remote interface or remote home interface of the bean.

Dependent value classes can be exposed in the remote interface or remote
home interface, and can be included in the client EJB JAR file.

[[gcnto]][[GSDVG00453]][[postgresql-case-insensitivity]]

==== PostgreSQL Case Insensitivity

Case-sensitive behavior cannot be achieved for PostgreSQL databases.
PostgreSQL databases internally convert all names to lower case, which
makes the following workarounds necessary:

* In the CMP 2.1 runtime, PostgreSQL table and column names are not
quoted, which makes these names case insensitive.
* Before running the `capture-schema` command on a PostgreSQL database,
make sure table and column names are lower case in the
`sun-cmp-mappings.xml` file.

[[beakr]][[GSDVG00454]][[no-support-for-lock-when-loaded-on-sybase]]

==== No Support for `lock-when-loaded` on Sybase

For EJB 2.1 beans, the `lock-when-loaded` consistency level is
implemented by placing update locks on the data corresponding to a bean
when the data is loaded from the database. There is no suitable
mechanism available on Sybase databases to implement this feature.
Therefore, the `lock-when-loaded` consistency level is not supported on
Sybase databases. See "link:application-deployment-guide/dd-elements.html#GSDPG00126[consistency]" in {productName} Application Deployment Guide.

[[beakp]][[GSDVG00455]][[sybase-finder-limitation]]

==== Sybase Finder Limitation

If a finder method with an input greater than 255 characters is executed
and the primary key column is mapped to a VARCHAR column, Sybase
attempts to convert type VARCHAR to type TEXT and generates the
following error:

[source]
----
com.sybase.jdbc2.jdbc.SybSQLException: Implicit conversion from datatype
'TEXT' to 'VARCHAR' is not allowed. Use the CONVERT function to run this query.
----

To avoid this error, make sure the finder method input is less than 255
characters.

[[beakq]][[GSDVG00456]][[date-and-time-fields]]

==== Date and Time Fields

If a field type is a Java date or time type (`java.util.Date`,
`java.sql.Date`, `java.sql.Time`, `java.sql.Timestamp`), make sure that
the field value exactly matches the value in the database.

For example, the following code uses a `java.sql.Date` type as a primary
key field:

[source,java]
----
java.sql.Date myDate = new java.sql.Date(System.currentTimeMillis())
BeanA.create(myDate, ...);
----

For some databases, this code results in only the year, month, and date
portion of the field value being stored in the database. Later if the
client tries to find this bean by primary key as follows, the bean is
not found in the database because the value does not match the one that
is stored in the database.

[source,java]
----
myBean = BeanA.findByPrimaryKey(myDate);
----

Similar problems can happen if the database truncates the timestamp
value while storing it, or if a custom query has a date or time value
comparison in its WHERE clause.

For automatic mapping to an Oracle database, fields of type
`java.util.Date`, `java.sql.Date`, and `java.sql.Time` are mapped to
Oracle's DATE data type. Fields of type `java.sql.Timestamp` are mapped
to Oracle's `TIMESTAMP(9)` data type.

[[beaks]][[GSDVG00457]][[set-recursive_triggers-to-false-on-mssql]]

==== Set `RECURSIVE_TRIGGERS` to `false` on MSSQL

For version consistency triggers on MSSQL, the property
`RECURSIVE_TRIGGERS` must be set to `false`, which is the default. If
set to `true`, triggers throw a `java.sql.SQLException`.

Set this property as follows:

[source,sql]
----
EXEC sp_dboption 'database-name', 'recursive triggers', 'FALSE'
go
----

You can test this property as follows:

[source,sql]
----
SELECT DATABASEPROPERTYEX('database-name', 'IsRecursiveTriggersEnabled')
go
----

[[gbhbr]][[GSDVG00458]][[mysql-database-restrictions]]

==== MySQL Database Restrictions

The following restrictions apply when you use a MySQL database with the
{productName} for persistence.

* MySQL treats `int1` and `int2` as reserved words. If you want to
define `int1` and `int2` as fields in your table, use `\`int1\`` and
`\`int2\`` field names in your SQL file.
* When `VARCHAR` fields get truncated, a warning is displayed instead of
an error. To get an error message, start the MySQL database in strict
SQL mode.
* The order of fields in a foreign key index must match the order in the
explicitly created index on the primary table.
* The `CREATE TABLE` syntax in the SQL file must end with the following
line.
+
[source,sql]
----
)  Engine=InnoDB;
----
`InnoDB` provides MySQL with a transaction-safe (ACID compliant) storage
engine having commit, rollback, and crash recovery capabilities.
* For a `FLOAT` type field, the correct precision must be defined. By
default, MySQL uses four bytes to store a `FLOAT` type that does not
have an explicit precision definition. For example, this causes a number
such as 12345.67890123 to be rounded off to 12345.7 during an `INSERT`.
To prevent this, specify `FLOAT(10,2)` in the DDL file, which forces the
database to use an eight-byte double-precision column. For more
information, see `http://dev.mysql.com/doc/mysql/en/numeric-types.html`.
* To use `||` as the string concatenation symbol, start the MySQL server
with the `--sql-mode="PIPES_AS_CONCAT"` option. For more information,
see `http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html` and
`http://dev.mysql.com/doc/mysql/en/ansi-mode.html`.
* MySQL always starts a new connection when `autoCommit==true` is set.
This ensures that each SQL statement forms a single transaction on its
own. If you try to rollback or commit an SQL statement, you get an error
message.
+
[source]
----
javax.transaction.SystemException: java.sql.SQLException:
Can't call rollback when autocommit=true

javax.transaction.SystemException: java.sql.SQLException:
Error open transaction is not closed
----
To resolve this issue, add `relaxAutoCommit=true` to the JDBC URL. For
more information, see `http://forums.mysql.com/read.php?39,31326,31404`.
* Change the trigger create format from the following:
+
[source,sql]
----
CREATE TRIGGER T_UNKNOWNPKVC1
BEFORE UPDATE ON UNKNOWNPKVC1
FOR EACH ROW
        WHEN (NEW.VERSION = OLD.VERSION)
BEGIN
        :NEW.VERSION := :OLD.VERSION + 1;
END;
/
----
To the following:
+
[source,sql]
----
DELIMITER |
CREATE TRIGGER T_UNKNOWNPKVC1
BEFORE UPDATE ON UNKNOWNPKVC1
FOR EACH ROW
        WHEN (NEW.VERSION = OLD.VERSION)
BEGIN
        :NEW.VERSION := :OLD.VERSION + 1;
END
|
DELIMITER ;
----
For more information, see
`http://dev.mysql.com/doc/mysql/en/create-trigger.html`.
* MySQL does not allow a `DELETE` on a row that contains a reference to
itself. Here is an example that illustrates the issue.
+
[source,sql]
----
create table EMPLOYEE (
        empId   int         NOT NULL,
        salary  float(25,2) NULL,
        mgrId   int         NULL,
        PRIMARY KEY (empId),
        FOREIGN KEY (mgrId) REFERENCES EMPLOYEE (empId)
        ) ENGINE=InnoDB;

        insert into Employee values (1, 1234.34, 1);
        delete from Employee where empId = 1;
----
This example fails with the following error message.
+
[source]
----
ERROR 1217 (23000): Cannot delete or update a parent row:
a foreign key constraint fails
----
To resolve this issue, change the table creation script to the
following:
+
[source,sql]
----
create table EMPLOYEE (
        empId   int         NOT NULL,
        salary  float(25,2) NULL,
        mgrId   int         NULL,
        PRIMARY KEY (empId),
        FOREIGN KEY (mgrId) REFERENCES EMPLOYEE (empId)
        ON DELETE SET NULL
        ) ENGINE=InnoDB;

        insert into Employee values (1, 1234.34, 1);
        delete from Employee where empId = 1;
----
This can be done only if the foreign key field is allowed to be null.
For more information, see
`http://dev.mysql.com/doc/mysql/en/innodb-foreign-key-constraints.html`.
* When an SQL script has foreign key constraints defined,
`capture-schema` fails to capture the table information correctly. To
work around the problem, remove the constraints and then run
`capture-schema`. Here is an example that illustrates the issue.
+
[source,sql]
----
CREATE TABLE ADDRESSBOOKBEANTABLE (ADDRESSBOOKNAME VARCHAR(255)
    NOT NULL PRIMARY KEY,
CONNECTEDUSERS              BLOB NULL,
OWNER                       VARCHAR(256),
FK_FOR_ACCESSPRIVILEGES     VARCHAR(256),
CONSTRAINT FK_ACCESSPRIVILEGE FOREIGN KEY (FK_FOR_ACCESSPRIVILEGES)
    REFERENCES ACCESSPRIVILEGESBEANTABLE (ROOT)
) ENGINE=InnoDB;
----
To resolve this issue, change the table creation script to the
following:
+
[source,sql]
----
CREATE TABLE ADDRESSBOOKBEANTABLE (ADDRESSBOOKNAME VARCHAR(255)
    NOT NULL PRIMARY KEY,
CONNECTEDUSERS              BLOB NULL,
OWNER                       VARCHAR(256),
FK_FOR_ACCESSPRIVILEGES     VARCHAR(256)
) ENGINE=InnoDB;
----


