Class AbstractTable
- java.lang.Object
-
- org.datanucleus.store.rdbms.table.AbstractTable
-
- All Implemented Interfaces:
Table,org.datanucleus.store.schema.table.Table
public abstract class AbstractTable extends Object implements Table
Abstract implementation of a table in the datastore. The table exists in various states. After initialisation it can be created in the datastore by calling create. At any point after initialisation it can be modified, but only by addition of columns. The table can be dropped from the datastore by calling drop.
-
-
Field Summary
Fields Modifier and Type Field Description protected List<org.datanucleus.store.schema.table.Column>columnsColumns for this table.protected Map<DatastoreIdentifier,Column>columnsByIdentifierIndex to the columns, keyed by name identifier.protected DatastoreAdapterdbaDatabase Adapter being used.protected BooleanexistsInDatastoreCache what we learned in a call to exists()protected DatastoreIdentifieridentifierIdentifier name for the table.protected shortstateState of the tableprotected RDBMSStoreManagerstoreMgrManager for this table.protected static shortTABLE_STATE_INITIALIZEDTable object has been initialised.protected static shortTABLE_STATE_INITIALIZED_MODIFIEDTable object has been initialized but has had structural modifications since.protected static shortTABLE_STATE_NEWTable object has just been created.protected static shortTABLE_STATE_PK_INITIALIZEDTable object is created and PK initialised.protected static shortTABLE_STATE_VALIDATEDTable object has been validated.
-
Constructor Summary
Constructors Constructor Description AbstractTable(DatastoreIdentifier identifier, RDBMSStoreManager storeMgr)Constructor taking the table name and the RDBMSManager managing this table.
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description ColumnaddColumn(String storedJavaType, DatastoreIdentifier name, JavaTypeMapping mapping, org.datanucleus.metadata.ColumnMetaData colmd)Creates a new column in the table.protected voidaddColumnInternal(Column col)Utility method to add a column to the internal representationprotected booleanallowDDLOutput()Determine whether we or our concrete class allow DDL to be written into a file instead of sending it to the DB.protected voidassertIsInitialized()protected voidassertIsInitializedModified()protected voidassertIsPKInitialized()protected voidassertIsPKUninitialized()protected voidassertIsUninitialized()protected voidassertIsValidated()booleancreate(Connection conn)Method to create the table in the datastore representation.voiddrop(Connection conn)Method to drop the table from the datastore representation.booleanequals(Object obj)protected voidexecuteDdlStatement(Statement stmt, String stmtText)Execute a single DDL SQL statement with appropriate logging.protected voidexecuteDdlStatementList(List<String> stmts, Connection conn)Method to perform the required SQL statements.booleanexists(Connection conn, boolean auto_create)Method to check the existence of the table/view, optionally auto creating it where required.StringgetCatalogName()Accessor for the Catalog Name.org.datanucleus.metadata.AbstractClassMetaDatagetClassMetaData()ColumngetColumn(DatastoreIdentifier identifier)Accessor for the column with the specified identifier.org.datanucleus.store.schema.table.ColumngetColumnForName(String name)org.datanucleus.store.schema.table.ColumngetColumnForPosition(int pos)List<org.datanucleus.store.schema.table.Column>getColumns()DatastoreIdentifiergetDatastoreIdentifierFullyQualified()Method that operates like toString except it returns a fully-qualified name that will always be fully-qualified even when the user hasnt specified the catalog/schema in PMF or MetaData.org.datanucleus.metadata.DiscriminatorMetaDatagetDiscriminatorMetaData()Accessor for Discriminator MetaData.DatastoreIdentifiergetIdentifier()Accessor for the SQL identifier (the table name).org.datanucleus.store.schema.table.MemberColumnMappinggetMemberColumnMappingForEmbeddedMember(List<org.datanucleus.metadata.AbstractMemberMetaData> mmds)org.datanucleus.store.schema.table.MemberColumnMappinggetMemberColumnMappingForMember(org.datanucleus.metadata.AbstractMemberMetaData mmd)Set<org.datanucleus.store.schema.table.MemberColumnMapping>getMemberColumnMappings()StringgetName()intgetNumberOfColumns()StringgetSchemaName()Accessor for the Schema Name.protected abstract List<String>getSQLCreateStatements(Properties props)Accessor for the SQL create statements.protected abstract List<String>getSQLDropStatements()Accessor for the SQL drop statements.RDBMSStoreManagergetStoreManager()ColumngetSurrogateColumn(org.datanucleus.store.schema.table.SurrogateColumnType colType)JavaTypeMappinggetSurrogateMapping(org.datanucleus.store.schema.table.SurrogateColumnType colType, boolean allowSuperclasses)Accessor for the mapping for the specified surrogate type.org.datanucleus.metadata.VersionMetaDatagetVersionMetaData()Accessor for the Version MetaData.booleanhasColumn(DatastoreIdentifier identifier)Checks if there is a column for the identifierprotected booleanhasColumnName(DatastoreIdentifier colName)Utility to return if a column of this name exists.inthashCode()booleanisInitialized()Accessor for whether the table has been initialised.booleanisInitializedModified()Accessor for whether the table has been modified since initialisation.booleanisPKInitialized()Accessor for whether the primary key of the table is initialised.booleanisValidated()Accessor for whether the table is validated.voidpostInitialize(org.datanucleus.ClassLoaderResolver clr)Post-initialize; for things that must be set after all classes have been initialized.voidpreInitialize(org.datanucleus.ClassLoaderResolver clr)Pre-initialize method; for things that must be initialized right after construction.protected booleantableExistsInDatastore(Connection conn)Determine whether our table exists in the datastore (without modifying datastore).StringtoString()Method to return a string version of this table.-
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
-
Methods inherited from interface org.datanucleus.store.rdbms.table.Table
getIdMapping, getMemberMapping, initialize, validate
-
-
-
-
Field Detail
-
TABLE_STATE_NEW
protected static final short TABLE_STATE_NEW
Table object has just been created.- See Also:
- Constant Field Values
-
TABLE_STATE_PK_INITIALIZED
protected static final short TABLE_STATE_PK_INITIALIZED
Table object is created and PK initialised.- See Also:
- Constant Field Values
-
TABLE_STATE_INITIALIZED
protected static final short TABLE_STATE_INITIALIZED
Table object has been initialised.- See Also:
- Constant Field Values
-
TABLE_STATE_INITIALIZED_MODIFIED
protected static final short TABLE_STATE_INITIALIZED_MODIFIED
Table object has been initialized but has had structural modifications since.- See Also:
- Constant Field Values
-
TABLE_STATE_VALIDATED
protected static final short TABLE_STATE_VALIDATED
Table object has been validated.- See Also:
- Constant Field Values
-
storeMgr
protected final RDBMSStoreManager storeMgr
Manager for this table.
-
dba
protected final DatastoreAdapter dba
Database Adapter being used.
-
identifier
protected final DatastoreIdentifier identifier
Identifier name for the table. Includes the catalog/schema internally (if defined by the user).
-
state
protected short state
State of the table
-
columns
protected List<org.datanucleus.store.schema.table.Column> columns
Columns for this table.
-
columnsByIdentifier
protected Map<DatastoreIdentifier,Column> columnsByIdentifier
Index to the columns, keyed by name identifier. TODO Key this by the column name, not its identifier.
-
existsInDatastore
protected Boolean existsInDatastore
Cache what we learned in a call to exists()
-
-
Constructor Detail
-
AbstractTable
public AbstractTable(DatastoreIdentifier identifier, RDBMSStoreManager storeMgr)
Constructor taking the table name and the RDBMSManager managing this table.- Parameters:
identifier- Name of the tablestoreMgr- The RDBMS Manager
-
-
Method Detail
-
isInitialized
public boolean isInitialized()
Description copied from interface:TableAccessor for whether the table has been initialised.- Specified by:
isInitializedin interfaceTable- Returns:
- Whether it is initialised.
-
preInitialize
public void preInitialize(org.datanucleus.ClassLoaderResolver clr)
Description copied from interface:TablePre-initialize method; for things that must be initialized right after construction.- Specified by:
preInitializein interfaceTable- Parameters:
clr- the ClassLoaderResolver
-
postInitialize
public void postInitialize(org.datanucleus.ClassLoaderResolver clr)
Description copied from interface:TablePost-initialize; for things that must be set after all classes have been initialized.- Specified by:
postInitializein interfaceTable- Parameters:
clr- the ClassLoaderResolver
-
isPKInitialized
public boolean isPKInitialized()
Accessor for whether the primary key of the table is initialised.- Returns:
- Whether the primary key of the table is initialised
-
isValidated
public boolean isValidated()
Description copied from interface:TableAccessor for whether the table is validated.- Specified by:
isValidatedin interfaceTable- Returns:
- Whether it is validated.
-
isInitializedModified
public boolean isInitializedModified()
Accessor for whether the table has been modified since initialisation.- Specified by:
isInitializedModifiedin interfaceTable- Returns:
- Whether it is modified since initialisation.
-
getStoreManager
public RDBMSStoreManager getStoreManager()
- Specified by:
getStoreManagerin interfaceTable- Specified by:
getStoreManagerin interfaceorg.datanucleus.store.schema.table.Table
-
getName
public String getName()
- Specified by:
getNamein interfaceorg.datanucleus.store.schema.table.Table
-
getCatalogName
public String getCatalogName()
Accessor for the Catalog Name. This will be part of the fully qualified name IF the user has specified the catalog in the MetaData, OR if they have specified the catalog in the PMF.- Specified by:
getCatalogNamein interfaceorg.datanucleus.store.schema.table.Table- Returns:
- Catalog Name
-
getSchemaName
public String getSchemaName()
Accessor for the Schema Name. This will be part of the fully qualified name IF the user has specified the schema in the MetaData, OR if they have specified the schema in the PMF.- Specified by:
getSchemaNamein interfaceorg.datanucleus.store.schema.table.Table- Returns:
- Schema Name
-
getIdentifier
public DatastoreIdentifier getIdentifier()
Accessor for the SQL identifier (the table name).- Specified by:
getIdentifierin interfaceTable- Returns:
- The name
-
getClassMetaData
public org.datanucleus.metadata.AbstractClassMetaData getClassMetaData()
- Specified by:
getClassMetaDatain interfaceorg.datanucleus.store.schema.table.Table
-
getNumberOfColumns
public int getNumberOfColumns()
- Specified by:
getNumberOfColumnsin interfaceorg.datanucleus.store.schema.table.Table
-
getColumns
public List<org.datanucleus.store.schema.table.Column> getColumns()
- Specified by:
getColumnsin interfaceorg.datanucleus.store.schema.table.Table
-
getColumnForPosition
public org.datanucleus.store.schema.table.Column getColumnForPosition(int pos)
- Specified by:
getColumnForPositionin interfaceorg.datanucleus.store.schema.table.Table
-
getSurrogateColumn
public Column getSurrogateColumn(org.datanucleus.store.schema.table.SurrogateColumnType colType)
- Specified by:
getSurrogateColumnin interfaceorg.datanucleus.store.schema.table.Table
-
getColumnForName
public org.datanucleus.store.schema.table.Column getColumnForName(String name)
- Specified by:
getColumnForNamein interfaceorg.datanucleus.store.schema.table.Table
-
getMemberColumnMappingForMember
public org.datanucleus.store.schema.table.MemberColumnMapping getMemberColumnMappingForMember(org.datanucleus.metadata.AbstractMemberMetaData mmd)
- Specified by:
getMemberColumnMappingForMemberin interfaceorg.datanucleus.store.schema.table.Table
-
getMemberColumnMappingForEmbeddedMember
public org.datanucleus.store.schema.table.MemberColumnMapping getMemberColumnMappingForEmbeddedMember(List<org.datanucleus.metadata.AbstractMemberMetaData> mmds)
- Specified by:
getMemberColumnMappingForEmbeddedMemberin interfaceorg.datanucleus.store.schema.table.Table
-
getMemberColumnMappings
public Set<org.datanucleus.store.schema.table.MemberColumnMapping> getMemberColumnMappings()
- Specified by:
getMemberColumnMappingsin interfaceorg.datanucleus.store.schema.table.Table
-
getSurrogateMapping
public JavaTypeMapping getSurrogateMapping(org.datanucleus.store.schema.table.SurrogateColumnType colType, boolean allowSuperclasses)
Description copied from interface:TableAccessor for the mapping for the specified surrogate type.- Specified by:
getSurrogateMappingin interfaceTable- Parameters:
colType- Column type for the surrogateallowSuperclasses- Whether to allow searching superclasses when not specified in this table.- Returns:
- The mapping
-
getVersionMetaData
public org.datanucleus.metadata.VersionMetaData getVersionMetaData()
Description copied from interface:TableAccessor for the Version MetaData.- Specified by:
getVersionMetaDatain interfaceTable- Returns:
- Returns the Version MetaData.
-
getDiscriminatorMetaData
public org.datanucleus.metadata.DiscriminatorMetaData getDiscriminatorMetaData()
Description copied from interface:TableAccessor for Discriminator MetaData.- Specified by:
getDiscriminatorMetaDatain interfaceTable- Returns:
- Returns the Discriminator MetaData.
-
addColumn
public Column addColumn(String storedJavaType, DatastoreIdentifier name, JavaTypeMapping mapping, org.datanucleus.metadata.ColumnMetaData colmd)
Creates a new column in the table. Will add the new Column and return it. If the new column clashes in name with an existing column of the required name will throw a DuplicateColumnNameException except when :-- The 2 columns are for same named fields in the class or its subclasses with the subclass(es) using "superclass-table" inheritance strategy. One of the columns has to come from a subclass - cant have both from the same class.
- Specified by:
addColumnin interfaceTable- Parameters:
storedJavaType- the java type of the columnname- the SQL identifier for the column to be addedmapping- the mapping for the column to be addedcolmd- ColumnMetaData for the column to be added to the table- Returns:
- the new Column
- Throws:
DuplicateColumnException- if a column already exists with same name and not a supported situation.
-
hasColumn
public boolean hasColumn(DatastoreIdentifier identifier)
Description copied from interface:TableChecks if there is a column for the identifier
-
getColumn
public Column getColumn(DatastoreIdentifier identifier)
Description copied from interface:TableAccessor for the column with the specified identifier. Returns null if has no column of this name.
-
create
public boolean create(Connection conn) throws SQLException
Description copied from interface:TableMethod to create the table in the datastore representation.- Specified by:
createin interfaceTable- Parameters:
conn- The connection to use- Returns:
- true if the table was created
- Throws:
SQLException- Thrown if an error occurs creating the table.
-
drop
public void drop(Connection conn) throws SQLException
Description copied from interface:TableMethod to drop the table from the datastore representation.- Specified by:
dropin interfaceTable- Parameters:
conn- The connection to use- Throws:
SQLException- Thrown if an error occurs
-
exists
public boolean exists(Connection conn, boolean auto_create) throws SQLException
Method to check the existence of the table/view, optionally auto creating it where required. If it doesn't exist and auto creation isn't specified this throws a MissingTableException.- Specified by:
existsin interfaceTable- Parameters:
conn- The JDBC Connectionauto_create- Whether to auto create the table if not existing- Returns:
- Whether the table was added
- Throws:
SQLException- Thrown when an error occurs in the JDBC calls
-
toString
public final String toString()
Method to return a string version of this table. This name is the fully-qualified name of the table,including catalog/schema names, where these are appropriate. They are included where the user has either specified the catalog/schema for the PMF, or in the MetaData. They are also only included where the datastore adapter supports their use.
-
getDatastoreIdentifierFullyQualified
public DatastoreIdentifier getDatastoreIdentifierFullyQualified()
Method that operates like toString except it returns a fully-qualified name that will always be fully-qualified even when the user hasnt specified the catalog/schema in PMF or MetaData. That is, it will add on any auto-calculated catalog/schema for the datastore. Note that this will never include any quoting strings required for insert/select etc.- Returns:
- The fully qualified name
-
addColumnInternal
protected void addColumnInternal(Column col)
Utility method to add a column to the internal representation- Parameters:
col- The column
-
hasColumnName
protected boolean hasColumnName(DatastoreIdentifier colName)
Utility to return if a column of this name exists.- Parameters:
colName- The column name- Returns:
- Whether the column of this name exists
-
getSQLCreateStatements
protected abstract List<String> getSQLCreateStatements(Properties props)
Accessor for the SQL create statements.- Parameters:
props- Properties controlling the table creation- Returns:
- The SQL Create statements
-
getSQLDropStatements
protected abstract List<String> getSQLDropStatements()
Accessor for the SQL drop statements.- Returns:
- The SQL Drop statements
-
assertIsPKUninitialized
protected void assertIsPKUninitialized()
-
assertIsUninitialized
protected void assertIsUninitialized()
-
assertIsInitialized
protected void assertIsInitialized()
-
assertIsInitializedModified
protected void assertIsInitializedModified()
-
assertIsPKInitialized
protected void assertIsPKInitialized()
-
assertIsValidated
protected void assertIsValidated()
-
allowDDLOutput
protected boolean allowDDLOutput()
Determine whether we or our concrete class allow DDL to be written into a file instead of sending it to the DB. Defaults to true.- Returns:
- Whether it allows DDL outputting
-
executeDdlStatementList
protected void executeDdlStatementList(List<String> stmts, Connection conn) throws SQLException
Method to perform the required SQL statements.- Parameters:
stmts- A List of statementsconn- The Connection to the datastore- Throws:
SQLException- Any exception thrown by the statements
-
executeDdlStatement
protected void executeDdlStatement(Statement stmt, String stmtText) throws SQLException
Execute a single DDL SQL statement with appropriate logging. If ddlWriter is set, do not actually execute the SQL but write it to that Writer.- Parameters:
stmt- The JDBC Statement object to execute onstmtText- The actual SQL statement text- Throws:
SQLException- Thrown if an error occurs
-
tableExistsInDatastore
protected boolean tableExistsInDatastore(Connection conn) throws SQLException
Determine whether our table exists in the datastore (without modifying datastore). Result is cached- Parameters:
conn- The Connection- Returns:
- Whether the table exists in the datastore
- Throws:
SQLException- Thrown if an error occurs
-
-