Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

EclipseLink/Development/JPA 2.0/undelimited identifiers

Undelimited Identifiers

JPA 2.0 Root | Enhancement Request

Issue Summary

The specification has added support to always treat meta data identifiers as if they are "quoted" preserving case and allowing reserved words to be used.


See JPA 2.0 ED section 2.13 for details.

This means SQL is sent to the database with a delimiter (usually the double quote). For instance:

SELECT "id", "username" from "USER"

General Solution

ORM.xml Parsing

A new attribute called useDelimitedIdentifiers will be added to our XMLPersistenceUnit defaults class and we will add parsing code to populate it from orm.xml. useDelimitedIdentifiers will default to false and be accessible through a getter method.

Delimiters

The default delimiter will be the double quote since this is the most common delimiters. It will be avaiable from the Helper class through a getter and setter method. Additionally, the getter method will check a system variable called: eclipselink.jdbc.delimiter and set use the value of that variable as the delimiter if it is supplied.

DatabaseField and DatabaseTable

The use of delimited identifiers will be represented on the DatabaseTable and DatabaseField with a boolean instance variable. The following modifications will be made to the classes

DatabaseField

  • add setUseDelimiters(boolean) method to set the instance variable
  • add getNameDelimited() method that returns the name with delimiters
  • alter getQualifiedName() method to return a delimited version of the qualified name
  • change code that initializes the name instance variable to check for delimiters remove them from the name and set the flag

DatabaseTable

  • add setUseDelimiters(boolean) method to set the instance variable
  • add getNameDelimited() method that returns the name with delimiters
  • add getQualifiedNameDelimited() method to return a delimited version of the qualified name
  • alter getTableQualifier() to return the delimited version of the table qualifier
  • change code that initializes the name instance variable to check for delimiters remove them from the name and set the flag

The reason we have chose to manage delimiters with a flag rather than simply storing the quoted values as the name in DatabaseField and DatabaseTable is as follows:

  • It makes it easier for metadata processing code to avoid adding delimiters twice
  • Result sets from database reads never come back with delimiters. As a result, in order to be able to look up fields in rows from the database, we need to be able to do a lookup without the delimiters

In the case where the delimited-identifiers flag is set as a persistence unit default and a field is delimited in the column definition (annotation or xml) we will delimit the field only once.

Metadata processing

Anywhere the metadata processing code creates a DatabaseField or DatabaseTable, a check will be done for useDelimitedIdentifiers in the persistence unit defaults and the useDelimitedIdentifiers flag on the DatabaseField or DatabaseTable will be set as appropriate.

Database Interaction

All calls to databaseField.getName() and databaseTable.getName() that are used to build SQL will be changed to getNameDelimited(). Additionally schema generation code will be updated to use the delimited name.

Open Issues

  • Default installations of MySQL do not allow delimiters in table names. They need to be set to ANSI mode. As a result, it is not clear if the tests will be able to successfully run as part of the nightly build
    • Should we have a flag that allows us to function with undelimited table names?

Back to the top