|  | 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 Oracle GlassFish Server. | 
|  |  | 
|  | The following topics are addressed here: | 
|  |  | 
|  | * link:#beajk[GlassFish Server 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 GlassFish Server supports the EJB 3.1 Lite | 
|  | specification, which allows enterprise beans within web applications, | 
|  | among other features. The full GlassFish Server 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]] | 
|  |  | 
|  | GlassFish Server Support for CMP | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | GlassFish Server 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 GlassFish Server 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]. | 
|  | * GlassFish Server 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 GlassFish Server 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 GlassFish Server 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 GlassFish Server | 
|  | Open Source Edition 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 GlassFish Server Open Source Edition 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 GlassFish Server 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 GlassFish Server 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 | 
|  | GlassFish Server does not support database-generated primary key values. | 
|  |  | 
|  | If the database schema is created during deployment, the GlassFish | 
|  | Server 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 GlassFish | 
|  | Server 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 | 
|  | GlassFish Server 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 GlassFish | 
|  | Server 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 GlassFish Server Open Source Edition | 
|  | 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 GlassFish Server 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 GlassFish | 
|  | Server, see the link:../release-notes/toc.html#GSRLN[GlassFish Server Open Source Edition Release | 
|  | Notes]. For configurations of supported and other drivers, see | 
|  | "link:../administration-guide/jdbc.html#GSADG00579[Configuration Specifics for JDBC Drivers]" in | 
|  | GlassFish Server Open Source Edition 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,oac_no_warn] | 
|  | ---- | 
|  | <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 GlassFish Server 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 GlassFish | 
|  | Server, see the link:../release-notes/toc.html#GSRLN[GlassFish Server Open Source Edition Release | 
|  | Notes]. For configurations of supported and other drivers, see | 
|  | "link:../administration-guide/jdbc.html#GSADG00579[Configuration Specifics for JDBC Drivers]" in | 
|  | GlassFish Server Open Source Edition 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,oac_no_warn] | 
|  | ---- | 
|  | <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 GlassFish Server | 
|  | 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 GlassFish Server, see the | 
|  | link:../release-notes/toc.html#GSRLN[GlassFish Server Open Source Edition Release Notes]. For | 
|  | configurations of supported and other drivers, see | 
|  | "link:../administration-guide/jdbc.html#GSADG00579[Configuration Specifics for JDBC Drivers]" in | 
|  | GlassFish Server Open Source Edition 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 | 
|  | GlassFish Server Open Source Edition 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 GlassFish Server domain. The default is `false`. | 
|  |  | 
|  | For further information and an example, see | 
|  | "link:../application-deployment-guide/dd-elements.html#GSDPG00261[schema-generator-properties]" in GlassFish Server Open | 
|  | Source Edition 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 GlassFish Server 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/toc.html#GSRFM[GlassFish Server | 
|  | Open Source Edition 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 GlassFish Server 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/toc.html#GSRFM[GlassFish Server Open Source Edition 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 | 
|  | GlassFish Server Open Source Edition 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 GlassFish | 
|  | Server, see the link:../release-notes/toc.html#GSRLN[GlassFish Server Open Source Edition Release | 
|  | Notes]. For configurations of supported and other drivers, see | 
|  | "link:../administration-guide/jdbc.html#GSADG00579[Configuration Specifics for JDBC Drivers]" in | 
|  | GlassFish Server Open Source Edition 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,oac_no_warn] | 
|  | ---- | 
|  | <cmp-resource> | 
|  | <jndi-name>jdbc/MyDatabase</jndi-name> | 
|  | </cmp-resource> | 
|  | ---- | 
|  |  | 
|  | [[beaki]][[GSDVG00155]][[performance-related-features]] | 
|  |  | 
|  | Performance-Related Features | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | The GlassFish Server 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 GlassFish Server Open | 
|  | Source Edition 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 GlassFish Server | 
|  | Open Source Edition 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 GlassFish Server Open Source | 
|  | Edition 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,oac_no_warn] | 
|  | ---- | 
|  | 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 GlassFish Server 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 GlassFish Server 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 GlassFish Server 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 GlassFish | 
|  | Server Open Source Edition 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,oac_no_warn] | 
|  | ---- | 
|  | 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 GlassFish Server 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 GlassFish Server specific deployment descriptor | 
|  | (`glassfish-ejb-jar.xml`) provides the following elements to store the | 
|  | EJB 1.1 finder method settings: | 
|  |  | 
|  | [source,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | Collection.contains(Object o) | 
|  | Collection.isEmpty() | 
|  | String.startsWith(String s) | 
|  | String.endsWith(String e) | 
|  | ---- | 
|  | In addition, the GlassFish Server supports the following nonstandard | 
|  | JDOQL methods. + | 
|  | [source,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | name == "Michael" | 
|  | ---- | 
|  |  | 
|  | The `finder` element of the `glassfish-ejb-jar.xml` file looks like | 
|  | this: | 
|  |  | 
|  | [source,oac_no_warn] | 
|  | ---- | 
|  | <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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | <finder> | 
|  | <method-name>findInRange</method-name> | 
|  | <query-params>double low, double high</query-params> | 
|  | <query-filter>low < price && price < 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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | (this.salary> player.salary) && (player.name == name) | 
|  | ---- | 
|  |  | 
|  | The `finder` element of the `glassfish-ejb-jar.xml` file looks like | 
|  | this: | 
|  |  | 
|  | [source,oac_no_warn] | 
|  | ---- | 
|  | <finder> | 
|  | <method-name>findByHigherSalary</method-name> | 
|  | <query-params>java.lang.String name</query-params> | 
|  | <query-filter> | 
|  | (this.salary > player.salary) && (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,oac_no_warn] | 
|  | ---- | 
|  | 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 GlassFish | 
|  | Server Open Source Edition 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 GlassFish | 
|  | Server Open Source Edition 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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | EXEC sp_dboption 'database-name', 'recursive triggers', 'FALSE' | 
|  | go | 
|  | ---- | 
|  |  | 
|  | You can test this property as follows: | 
|  |  | 
|  | [source,oac_no_warn] | 
|  | ---- | 
|  | 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 | 
|  | GlassFish Server 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,oac_no_warn] | 
|  | ---- | 
|  | )  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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | 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,oac_no_warn] | 
|  | ---- | 
|  | CREATE TABLE ADDRESSBOOKBEANTABLE (ADDRESSBOOKNAME VARCHAR(255) | 
|  | NOT NULL PRIMARY KEY, | 
|  | CONNECTEDUSERS              BLOB NULL, | 
|  | OWNER                       VARCHAR(256), | 
|  | FK_FOR_ACCESSPRIVILEGES     VARCHAR(256) | 
|  | ) ENGINE=InnoDB; | 
|  | ---- | 
|  |  | 
|  |  |