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