Class SpringSQLSchemaUpdater

java.lang.Object
org.dellroad.stuff.schema.AbstractSchemaUpdater<DataSource,Connection>
org.dellroad.stuff.schema.SQLSchemaUpdater
org.dellroad.stuff.spring.SpringSQLSchemaUpdater
All Implemented Interfaces:
Aware, BeanFactoryAware, InitializingBean

public class SpringSQLSchemaUpdater extends org.dellroad.stuff.schema.SQLSchemaUpdater implements BeanFactoryAware, InitializingBean
SQLSchemaUpdater optimized for use with Spring.
  • apply() is overridden so Spring DataAccessExceptions are thrown.
  • indicatesUninitializedDatabase() is overridden to examine exceptions and more precisely using Spring's exception translation infrastructure to filter out false positives.
  • getOrderingTieBreaker() is overridden to break ties by ordering updates in the same order as they are defined in the bean factory.
  • This class implements InitializingBean and verifies all required properties are set.
  • If no updates are explicitly configured, then all SpringSQLSchemaUpdates found in the containing bean factory are automatically configured.

An example of how this class can be combined with custom XML to define an updater, all its updates, and a SchemaUpdatingDataSource that automatically updates the database schema:


  <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:dellroad-stuff="http://dellroad-stuff.googlecode.com/schema/dellroad-stuff"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://dellroad-stuff.googlecode.com/schema/dellroad-stuff
        http://dellroad-stuff.googlecode.com/svn/wiki/schemas/dellroad-stuff-1.0.xsd">

     <!-- DataSource that automatically updates the database schema -->
     <bean id="dataSource" class="org.dellroad.stuff.schema.SchemaUpdatingDataSource"
       p:dataSource-ref="realDataSource" p:schemaUpdater-ref="schemaUpdater"/>

     <!--
          Database updater bean. This is used on first access to the DataSource above. Notes:
            - "databaseInitialization" is used to initialize the schema (first time only)
            - "updateTableInitialization" is used to initialize the update table (first time only)
            - In this example, we just use dellroad-stuff's update table initialization for MySQL
            - The <dellroad-stuff:sql-update> beans below will be auto-detected
     -->
     <bean id="schemaUpdater" class="org.dellroad.stuff.spring.SpringSQLSchemaUpdater">
         <property name="databaseInitialization">
             <dellroad-stuff:sql resource="classpath:databaseInit.sql"/>
         </property>
         <property name="updateTableInitialization">
             <dellroad-stuff:sql resource="classpath:org/dellroad/stuff/schema/updateTable-mysql.sql"/>
         </property>
     </bean>

      <!-- Schema update to add the 'phone' column to the 'User' table -->
      <dellroad-stuff:sql-update id="addPhone">ALTER TABLE User ADD phone VARCHAR(64)</dellroad-stuff:sql-update>

      <!-- Schema update to run some complicated external SQL script -->
      <dellroad-stuff:sql-update id="majorChanges" depends-on="addPhone" resource="classpath:majorChanges.sql"/>

      <!-- Multiple SQL commands that will be automatically separated into distinct updates -->
      <dellroad-stuff:sql-update id="renameColumn">
          ALTER TABLE User ADD newName VARCHAR(64);
          ALTER TABLE User SET newName = oldName;
          ALTER TABLE User DROP oldName;
      </dellroad-stuff:sql-update>

      <!-- Add more schema updates over time as needed and everything just works... -->

  </beans>
 

In the case no schema updates are explicitly configured, it is required that this updater and all of its schema updates are defined in the same ListableBeanFactory.

  • Field Summary

    Fields inherited from class org.dellroad.stuff.schema.SQLSchemaUpdater

    DEFAULT_UPDATE_TABLE_NAME, DEFAULT_UPDATE_TABLE_NAME_COLUMN, DEFAULT_UPDATE_TABLE_TIME_COLUMN

    Fields inherited from class org.dellroad.stuff.schema.AbstractSchemaUpdater

    log
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    void
     
    protected void
    apply(Connection c, org.dellroad.stuff.schema.DatabaseAction<Connection> action)
    Apply a DatabaseAction to a Connection.
    protected Comparator<org.dellroad.stuff.schema.SchemaUpdate<Connection>>
    Get the preferred ordering of two updates that do not have any predecessor constraints (including implied indirect constraints) between them.
    protected boolean
    Determine if an exception thrown during SQLSchemaUpdater.databaseNeedsInitialization(java.sql.Connection) is consistent with an uninitialized database.
    void
     
    Converts SQLExceptions into Spring DataAccessExceptions.

    Methods inherited from class org.dellroad.stuff.schema.SQLSchemaUpdater

    commitTransaction, databaseNeedsInitialization, getAppliedUpdateNames, getDatabaseInitialization, getTransactionIsolation, getUpdateTableInitialization, getUpdateTableName, getUpdateTableNameColumn, getUpdateTableTimeColumn, initializeAndUpdateDatabase, initializeDatabase, openTransaction, recordUpdateApplied, rollbackTransaction, setDatabaseInitialization, setTransactionIsolation, setUpdateTableInitialization, setUpdateTableName, setUpdateTableNameColumn, setUpdateTableTimeColumn

    Methods inherited from class org.dellroad.stuff.schema.AbstractSchemaUpdater

    applyInTransaction, generateMultiUpdateName, getAllUpdateNames, getUpdates, isIgnoreUnrecognizedUpdates, isValidUpdateName, setIgnoreUnrecognizedUpdates, setUpdates

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait