Kodo JPA/JDO can take advantage of any JDBC 2.x compliant driver, making almost any major database a candidate for use. See our officially supported database list in Appendix 3, Supported Databases for more information. Typically, Kodo auto-configures its JDBC behavior and SQL dialect for your database, based on the values of your connection-related configuration properties.
If Kodo cannot detect what type of database you are using, or if
you are using an unsupported database, you will have to tell Kodo
what org.apache.openjpa.jdbc.sql.DBDictionary
to use.
The DBDictionary
abstracts away the differences
between databases. You can plug a dictionary into Kodo using the
kodo.jdbc.DBDictionary
configuration property. The built-in dictionaries
are listed below. If you are using an unsupported database, you may
have to write your own DBDictionary
subclass,
a simple process.
access
: Dictionary for Microsoft
Access. This is an alias for the
org.apache.openjpa.jdbc.sql.AccessDictionary
class.
db2
: Dictionary for IBM's DB2 database.
This is an alias for the
org.apache.openjpa.jdbc.sql.DB2Dictionary
class.
derby
: Dictionary for the Apache Derby
database. This is an alias for the
org.apache.openjpa.jdbc.sql.DerbyDictionary
class.
empress
: Dictionary for Empress database
This is an alias for the
org.apache.openjpa.jdbc.sql.EmpressDictionary
class.
foxpro
: Dictionary for Microsoft
Visual FoxPro. This is an alias for the
org.apache.openjpa.jdbc.sql.FoxProDictionary
class.
hsql
: Dictionary for the Hypersonic SQL
database. This is an alias for the
org.apache.openjpa.jdbc.sql.HSQLDictionary
class.
informix
: Dictionary for the Informix
database. This is an alias for the
org.apache.openjpa.jdbc.sql.InformixDictionary
class.
jdatastore
: Dictionary for Borland
JDataStore. This is an alias for the
org.apache.openjpa.jdbc.sql.JDataStoreDictionary
class.
mysql
: Dictionary for the MySQL
database. This is an alias for the
org.apache.openjpa.jdbc.sql.MySQLDictionary
class.
oracle
: Dictionary for Oracle.
This is an alias for the
org.apache.openjpa.jdbc.sql.OracleDictionary
class.
pointbase
: Dictionary for Pointbase Embedded
database. This is an alias for the
org.apache.openjpa.jdbc.sql.PointbaseDictionary
class.
postgres
: Dictionary for PostgreSQL.
This is an alias for the
org.apache.openjpa.jdbc.sql.PostgresDictionary
class.
sqlserver
: Dictionary for Microsoft's
SQLServer database. This is an alias for the
org.apache.openjpa.jdbc.sql.SQLServerDictionary
class.
sybase
: Dictionary for Sybase.
This is an alias for the
org.apache.openjpa.jdbc.sql.SybaseDictionary
class.
The example below demonstrates how to set a dictionary and configure
its properties in your configuration file. The DBDictionary
property uses Kodo's
plugin syntax.
Example 4.7. Specifying a DBDictionary
JPA XML format:
<property name="kodo.jdbc.DBDictionary" value="hsql(SimulateLocking=true)"/>
JDO properties format:
kodo.jdbc.DBDictionary: hsql(SimulateLocking=true)
The standard dictionaries all recognize the following properties.
These properties will usually not need to be overridden, since the
dictionary implementation should use the appropriate default values
for your database. You typically won't use these properties
unless you are designing your own DBDictionary
for an unsupported database.
DriverVendor
: The vendor of the particular
JDBC driver you are using. Some dictionaries must alter their
behavior depending on the driver vendor. See the
VENDOR_XXX
constants defined in your
dictionary's Javadoc for available options.
CatalogSeparator
:
The string the database uses to delimit between
the schema name and the table name. This is typically
"."
, which is the default.
CreatePrimaryKeys
: If
false
, then do not create database
primary keys for identifiers. Defaults to
true
.
ConstraintNameMode
: When
creating constraints, whether to put the constraint name
before the definition (before
), just after
the constraint type name (mid
), or after the
constraint definition (after
).
Defaults to before
.
MaxTableNameLength
: The maximum number
of characters in a table name. Defaults to 128.
MaxColumnNameLength
: The maximum number
of characters in a column name. Defaults to 128.
MaxConstraintNameLength
: The maximum number
of characters in a constraint name. Defaults to 128.
MaxIndexNameLength
: The maximum number
of characters in an index name. Defaults to 128.
MaxAutoAssignNameLength
: Set
this property to the maximum length of name for
sequences used for auto-increment columns. Names
longer than this value are truncated.
Defaults to 31
.
MaxIndexesPerTable
: The maximum number
of indexes that can be placed on a single table. Defaults to
no limit.
SupportsForeignKeys
: Whether the database
supports foreign keys. Defaults to true.
SupportsTimestampNanos
: Whether the JDBC
driver supports nanoseconds with TIMESTAMP columns. Defaults
to true.
SupportsUniqueConstraints
: Whether the
database supports unique constraints. Defaults to true.
SupportsDeferredConstraints
: Whether the
database supports deferred constraints. Defaults to true.
SupportsRestrictDeleteAction
: Whether the
database supports the RESTRICT foreign key delete action.
Defaults to true
.
SupportsCascadeDeleteAction
: Whether the
database supports the CASCADE foreign key delete action.
Defaults to true
.
SupportsNullDeleteAction
: Whether the
database supports the SET NULL foreign key delete action.
Defaults to true
.
SupportsDefaultDeleteAction
: Whether the
database supports the SET DEFAULT foreign key delete action.
Defaults to true
.
SupportsAlterTableWithAddColumn
: Whether the
database supports adding a new column in an ALTER TABLE
statement. Defaults to true
.
SupportsAlterTableWithDropColumn
: Whether
the database supports dropping a column in an ALTER TABLE
statement. Defaults to true
.
ReservedWords
: A comma-separated list of
reserved words for this database, beyond the standard SQL92
keywords.
SystemTables
: A comma-separated list of
table names that should be ignored.
SystemSchemas
: A comma-separated list of
schema names that should be ignored.
SchemaCase
: The case to use when querying
the database metadata about schema components. Defaults to
making all names upper case. Available values are:
upper, lower, preserve
.
ValidationSQL
: The SQL used to
validate that a connection is still in a valid state. For
example, "SELECT SYSDATE FROM DUAL
" for
Oracle.
InitializationSQL
: A piece of SQL to issue
against the database whenever a connection is retrieved from
the DataSource
.
JoinSyntax
: The SQL join syntax
to use in select statements. See
Section 4.7, “Setting the SQL Join Syntax”.
CrossJoinClause
: The clause to use for
a cross join (cartesian product).
Defaults to CROSS JOIN
.
InnerJoinClause
: The clause to use for
an inner join. Defaults to INNER JOIN
.
OuterJoinClause
: The clause to use for
an left outer join.
Defaults to LEFT OUTER JOIN
.
RequiresConditionForCrossJoin
: Some
databases require that there always be a conditional
statement for a cross join. If set, this parameter ensures
that there will always be some condition to the join clause.
ToUpperCaseFunction
: SQL function call for
for converting a string to upper case. Use the token
{0}
to represent the argument.
ToLowerCaseFunction
: Name of the SQL function
for converting a string to lower case. Use the token
{0}
to represent the argument.
StringLengthFunction
: Name of the SQL
function for getting the length of a string. Use the token
{0}
to represent the argument.
SubstringFunctionName
: Name of the SQL
function for getting the substring of a string.
DistinctCountColumnSeparator
:
The string the database uses to delimit between column
expressions in a SELECT COUNT(DISTINCT column-list)
clause. Defaults to null for most databases,
meaning that multiple columns in a distinct COUNT clause are
not supported.
ForUpdateClause
: The clause to append to
SELECT
statements to issue queries that
obtain pessimistic locks. Defaults to
FOR UPDATE
.
TableForUpdateClause
: The clause to append
to the end of each table alias in queries that obtain
pessimistic locks. Defaults to null.
SupportsSelectForUpdate
: If true, then the
database supports SELECT
statements with a
pessimistic locking clause. Defaults to true.
SupportsLockingWithDistinctClause
: If true,
then the database supports FOR UPDATE
select clauses with DISTINCT
clauses.
SupportsLockingWithOuterJoin
: If true, then
the database supports FOR UPDATE
select
clauses with outer join queries.
SupportsLockingWithInnerJoin
: If true, then
the database supports FOR UPDATE
select
clauses with inner join queries.
SupportsLockingWithMultipleTables
: If true,
then the database supports FOR UPDATE
select
clauses that select from multiple tables.
SupportsLockingWithOrderClause
: If true,
then the database supports FOR UPDATE
select clauses with ORDER BY
clauses.
SupportsLockingWithSelectRange
: If true,
then the database supports FOR UPDATE
select clauses with queries that select a range of data using
LIMIT
, TOP
or the
database equivalent. Defaults to true.
SimulateLocking
: Some databases
do not support pessimistic locking, which will result in
an exception when you attempt a pessimistic
transaction. Setting this property to
true
bypasses the locking check to
allow pessimistic transactions even on databases that
do not support locking. Defaults to false
.
SupportsQueryTimeout
: If true, then the
JDBC driver supports calls to
java.sql.Statement.setQueryTimeout
.
SupportsHaving
: Whether this database
supports HAVING clauses in selects.
SupportsSelectStartIndex
: Whether this
database can create a select that skips the first N results.
SupportsSelectEndIndex
: Whether this
database can create a select that is limited to the first N
results.
SupportsSubselect
: Whether this database
supports subselects in queries.
RequiresAliasForSubselect
: If true, then
the database requires that subselects in a FROM clause be
assigned an alias.
SupportsMultipleNontransactionalResultSets
:
If true, then a nontransactional connection is capable
of having multiple open ResultSet
instances.
StorageLimitationsFatal
: If true, then any
data truncation/rounding that is performed by the dictionary
in order to store a value in the database will be treated as
a fatal error, rather than just issuing a warning.
StoreLargeNumbersAsStrings
: Many
databases have limitations on the number of digits that can
be stored in a numeric field (for example, Oracle can only
store 38 digits). For applications that operate
on very large BigInteger
and
BigDecimal
values, it may be
necessary to store these objects as string fields rather
than the database's numeric type. Note that this may
prevent meaningful numeric queries from being executed
against the database. Defaults to
false
.
StoreCharsAsNumbers
: Set this property
to false
to store Java
char
fields as CHAR
values rather than numbers. Defaults to true
.
UseGetBytesForBlobs
: If true, then
ResultSet.getBytes
will be used to
obtain blob data rather than
ResultSet.getBinaryStream
.
UseGetObjectForBlobs
: If true, then
ResultSet.getObject
will be used to
obtain blob data rather than
ResultSet.getBinaryStream
.
UseSetBytesForBlobs
: If true, then
PreparedStatement.setBytes
will be used to set blob data, rather than
PreparedStatement.setBinaryStream
.
UseGetStringForClobs
: If true, then
ResultSet.getString
will be used to
obtain clob data rather than
ResultSet.getCharacterStream
.
UseSetStringForClobs
: If true, then
PreparedStatement.setString
will be used to set clob data, rather than
PreparedStatement.setCharacterStream
.
CharacterColumnSize
: The default size of
varchar
and char
columns.
Typically 255.
ArrayTypeName
: The overridden default
column type for java.sql.Types.ARRAY
.
This is only used when the schema is generated by
the mappingtool
.
BigintTypeName
: The overridden default
column type for java.sql.Types.BIGINT
.
This is only used when the schema is generated by
the mappingtool
.
BinaryTypeName
: The overridden default
column type for java.sql.Types.BINARY
.
This is only used when the schema is generated by
the mappingtool
.
BitTypeName
: The overridden default
column type for java.sql.Types.BIT
.
This is only used when the schema is generated by
the mappingtool
.
BlobTypeName
: The overridden default
column type for java.sql.Types.BLOB
.
This is only used when the schema is generated by
the mappingtool
.
CharTypeName
: The overridden default
column type for java.sql.Types.CHAR
.
This is only used when the schema is generated by
the mappingtool
.
ClobTypeName
: The overridden default
column type for java.sql.Types.CLOB
.
This is only used when the schema is generated by
the mappingtool
.
DateTypeName
: The overridden default
column type for java.sql.Types.DATE
.
This is only used when the schema is generated by
the mappingtool
.
DecimalTypeName
: The overridden default
column type for java.sql.Types.DECIMAL
.
This is only used when the schema is generated by
the mappingtool
.
DistinctTypeName
: The overridden default
column type for java.sql.Types.DISTINCT
.
This is only used when the schema is generated by
the mappingtool
.
DoubleTypeName
: The overridden default
column type for java.sql.Types.DOUBLE
.
This is only used when the schema is generated by
the mappingtool
.
FloatTypeName
: The overridden default
column type for java.sql.Types.FLOAT
.
This is only used when the schema is generated by
the mappingtool
.
IntegerTypeName
: The overridden default
column type for java.sql.Types.INTEGER
.
This is only used when the schema is generated by
the mappingtool
.
JavaObjectTypeName
: The overridden default
column type for java.sql.Types.JAVAOBJECT
.
This is only used when the schema is generated by
the mappingtool
.
LongVarbinaryTypeName
: The overridden default
column type for java.sql.Types.LONGVARBINARY
.
This is only used when the schema is generated by
the mappingtool
.
LongVarcharTypeName
: The overridden default
column type for java.sql.Types.LONGVARCHAR
.
This is only used when the schema is generated by
the mappingtool
.
NullTypeName
: The overridden default
column type for java.sql.Types.NULL
.
This is only used when the schema is generated by
the mappingtool
.
NumericTypeName
: The overridden default
column type for java.sql.Types.NUMERIC
.
This is only used when the schema is generated by
the mappingtool
.
OtherTypeName
: The overridden default
column type for java.sql.Types.OTHER
.
This is only used when the schema is generated by
the mappingtool
.
RealTypeName
: The overridden default
column type for java.sql.Types.REAL
.
This is only used when the schema is generated by
the mappingtool
.
RefTypeName
: The overridden default
column type for java.sql.Types.REF
.
This is only used when the schema is generated by
the mappingtool
.
SmallintTypeName
: The overridden default
column type for java.sql.Types.SMALLINT
.
This is only used when the schema is generated by
the mappingtool
.
StructTypeName
: The overridden default
column type for java.sql.Types.STRUCT
.
This is only used when the schema is generated by
the mappingtool
.
TimeTypeName
: The overridden default
column type for java.sql.Types.TIME
.
This is only used when the schema is generated by
the mappingtool
.
TimestampTypeName
: The overridden default
column type for java.sql.Types.TIMESTAMP
.
This is only used when the schema is generated by
the mappingtool
.
TinyintTypeName
: The overridden default
column type for java.sql.Types.TINYINT
.
This is only used when the schema is generated by
the mappingtool
.
VarbinaryTypeName
: The overridden default
column type for java.sql.Types.VARBINARY
.
This is only used when the schema is generated by
the mappingtool
.
VarcharTypeName
: The overridden default
column type for java.sql.Types.VARCHAR
.
This is only used when the schema is generated by
the mappingtool
.
UseSchemaName
: If false
,
then avoid including the schema name in table name references.
Defaults to true
.
TableTypes
: Comma-separated list of table
types to use when looking for tables during schema reflection,
as defined in the
java.sql.DatabaseMetaData.getTableInfo
JDBC method. An example is:
"TABLE,VIEW,ALIAS"
. Defaults to
"TABLE"
.
SupportsSchemaForGetTables
: If false, then
the database driver does not support using
the schema name for schema reflection on table names.
SupportsSchemaForGetColumns
: If false, then
the database driver does not support using
the schema name for schema reflection on column names.
SupportsNullTableForGetColumns
:
If true, then the database supports passing a
null
parameter to
DatabaseMetaData.getColumns
as an optimization to get information about all the tables.
Defaults to true
.
SupportsNullTableForGetPrimaryKeys
:
If true, then the database supports passing a
null
parameter to
DatabaseMetaData.getPrimaryKeys
as an optimization to get information about all the tables.
Defaults to false
.
SupportsNullTableForGetIndexInfo
:
If true, then the database supports passing a
null
parameter to
DatabaseMetaData.getIndexInfo
as an optimization to get information about all the tables.
Defaults to false
.
SupportsNullTableForGetImportedKeys
:
If true, then the database supports passing a
null
parameter to
DatabaseMetaData.getImportedKeys
as an optimization to get information about all the tables.
Defaults to false
.
UseGetBestRowIdentifierForPrimaryKeys
:
If true, then metadata queries will use
DatabaseMetaData.getBestRowIdentifier
to obtain information about primary keys, rather than
DatabaseMetaData.getPrimaryKeys
.
RequiresAutoCommitForMetadata
:
If true, then the JDBC driver requires that autocommit
be enabled before any schema interrogation operations can
take place.
AutoAssignClause
: The column definition
clause to append to a creation statement. For example,
"AUTO_INCREMENT
" for MySQL. This property
is set automatically in the dictionary, and should not need to
be overridden, and is only used when the schema is generated
using the mappingtool
.
AutoAssignTypeName
: The column type name
for auto-increment columns. For example,
"SERIAL
" for PostgreSQL. This property is
set automatically in the dictionary, and should not need to be
overridden, and is only used when the schema is generated
using the mappingtool
.
LastGeneratedKeyQuery
: The query to issue
to obtain the last automatically generated key for an
auto-increment column. For example,
"select @@identity
" for Sybase.
This property is set automatically in the
dictionary, and should not need to be overridden.
NextSequenceQuery
: A SQL string for
obtaining a native sequence value. May use a placeholder of
{0}
for the variable sequence name. Defaults
to a database-appropriate value.
The mysql
dictionary also understands the
following properties:
DriverDeserializesBlobs
: Many MySQL
drivers automatically deserialize BLOBs on calls to
ResultSet.getObject
.
The MySQLDictionary
overrides the
standard DBDictionary.getBlobObject
method to take this into account. If your driver does not
deserialize automatically, set this property to
false
.
TableType
: The MySQL table type to
use when creating tables. Defaults to
innodb
.
UseClobs
: Some older versions of
MySQL do not handle clobs correctly. To enable clob
functionality, set this to true. Defaults to
false
.
The oracle
dictionary understands the
following additional properties:
UseTriggersForAutoAssign
:
If true, then Kodo will allow simulation of auto-increment
columns by the use of Oracle triggers. Kodo will
assume that the current sequence value from the sequence
specified in the
AutoAssignSequenceName
parameter
will hold the value of the new primary key for rows that
have been inserted.
For more details on auto-increment support, see
Section 5.3.3, “Autoassign / Identity Strategy Caveats”.
AutoAssignSequenceName
:
The global name of the sequence that Kodo will
assume to hold the value of primary key value
for rows that use auto-increment. If left unset, Kodo will
use a the sequence named
"SEQ_<table name>"
.
MaxEmbeddedBlobSize
:
Oracle is unable to persist BLOBs using the embedded update
method when BLOBs get over a certain size. The size depends
on database configuration, e.g. encoding. This property
defines the maximum size BLOB to persist with the embedded
method. Defaults to 4000 bytes.
MaxEmbeddedClobSize
:
Oracle is unable to persist CLOBs using the embedded update
method when Clobs get over a certain size. The size depends
on database configuration, e.g. encoding. This property
defines the maximum size CLOB to persist with the embedded
method. Defaults to 4000 characters.
UseSetFormOfUseForUnicode
:
Prior to Oracle 10i, statements executed against
unicode capable columns (the NCHAR
,
NVARCHAR
, NCLOB
Oracle types) required special handling to be able to
store unicode values. Setting this property
to true (the default) will cause Kodo to attempt
to detect when the column of one of these types, and
if so, will attempt to correctly configure the
statement using the
OraclePreparedStatement.setFormOfUse
.
For more details, see the Oracle
Readme For NChar.
Note that this can only work if Kodo is able to
access the underlying
OraclePreparedStatement
instance,
which may not be possible when using some third-party
datasources. If Kodo detects that this is the case,
a warning will be logged.