Last modified by christoph_lechleitner@iteg_at on 2013-01-31 07.32:56
From version 8.1
edited by christoph_lechleitner@iteg_at
on 2013-01-31 07.32:56
on 2013-01-31 07.32:56
Change comment:
Migrated to Confluence 5.3
To version 3.1
edited by 5fbc055b7cc103006957e1ae
on 2012-06-14 07.03:35
on 2012-06-14 07.03:35
Change comment:
There is no comment for this version
Summary
-
Page properties (2 modified, 0 added, 0 removed)
-
Objects (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki.c hristoph_lechleitner@iteg_at1 +XWiki.5fbc055b7cc103006957e1ae - Content
-
... ... @@ -1,78 +1,27 @@ 1 1 = {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-Preliminary"/}}Preliminary = 2 2 3 -The SchemaManager ({{code language="none"}}org.clazzes.jdbc2xml.schema.SchemaManager{{/code}}) andSchemaEngineprovidemeansto maintainthe database schemeofanapplication, allowing you to add and delete tables, columns, relations and data in the databasealongapplication updates.3 +The SchemaManager and SchemaEngine give you an abstracted access to the database schema of your application, allowing you to add and delete tables, columns, relations and data in the database on application updates. It uses a designated table to keep track of the current schema status, which it will check whenever it is run, and update the database if it is not at the correct version. 4 4 5 - ==={{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-SchemaHistoryTable"/}}SchemaHistoryTable===5 +SchemaManager ({{code language="none"}}org.clazzes.jdbc2xml.schema.SchemaManager{{/code}}) will create a table called SCHEMA_HISTORY if it can not find it the first time it is run. This table contains the following columns: 6 6 7 -A designated schema table, by default named SCHEMA_HISTORY, is used to keep track of the current scheme. It will be automatically at SchemaManager's first run. (% style="font-size: 10.0pt;line-height: 13.0pt;" %)SCHEMA_HISTORY contains the following columns: 7 +{{code language="none"}} 8 +VERSION:varchar(10), not null, primary key 9 +DESCRIPTION:varchar(512), nullable 10 +CREATION_DATE:date, nullable 11 +SERIALNR:integer(5), not null 12 +{{/code}} 8 8 9 -|=((( 10 - 11 -)))|=((( 12 - 13 -))) 14 -|((( 15 -(% class="code" %) 16 -((( 17 -VERSION 18 -))) 19 -)))|((( 20 -(% class="code" %) 21 -((( 22 -varchar(10), not null, primary key 23 -))) 24 -))) 25 -|((( 26 -(% class="code" %) 27 -((( 28 -DESCRIPTION 29 -))) 30 -)))|((( 31 -(% class="code" %) 32 -((( 33 -varchar(512), nullable 34 -))) 35 -))) 36 -|((( 37 -(% class="code" %) 38 -((( 39 -CREATION_DATE 40 -))) 41 -)))|((( 42 -(% class="code" %) 43 -((( 44 -date, nullable 45 -))) 46 -))) 47 -|((( 48 -(% class="code" %) 49 -((( 50 -SERIALNR 51 -))) 52 -)))|((( 53 -(% class="code" %) 54 -((( 55 -integer(5), not null 56 -))) 57 -))) 58 - 59 -=== {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-CustomnameforSchemaHistoryTable"/}}Custom name for Schema History Table === 60 - 61 -(% style="font-size: 10.0pt;line-height: 13.0pt;" %)In (% style="font-size: 10.0pt;font-weight: normal;line-height: 13.0pt;" %)heterogenous environments as well as in heavily modularized software architectures a single database may be shared by multiple parties each requiring a couple of tables. 62 - 63 -(% style="font-size: 10.0pt;font-weight: normal;line-height: 13.0pt;" %)To allow multiple modules (applications, libraries, other OSGi bundles) to use (% style="font-size: 10.0pt;line-height: 13.0pt;" %)JDBC2XML's SchemaManager concurrently within one database, as of JDBC 1.1.1 SchemaManager hold the name of the schema history table in an overwritable property, {{code language="none"}}versionHistoryTable{{/code}}. See (%%)[[JDBCTOXML-11>>url:https://jira.clazzes.org/browse/JDBCTOXML-11||shape="rect"]](% style="font-size: 10.0pt;line-height: 13.0pt;" %). 64 - 65 65 = {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-ProjectConfiguration"/}}Project Configuration = 66 66 67 -SchemaManager requires a DataSource ({{code language="none"}}javax.sql.DataSource{{/code}}) and a list of TableInfo ({{code language="none"}}org.clazzes.jdbc2xml.schema.TableInfo{{/code}}) Objects, from which databasestructureswill be created if an"empty"databaseisdetected.Furthermore,an implementation of ISchemaEngine ({{code language="none"}}org.clazzes.jdbc2xml.schema.ISchemaEngine{{/code}})is required.16 +To function correctly, SchemaManager needs a DataSource ({{code language="none"}}javax.sql.DataSource{{/code}}) and a list of TableInfo ({{code language="none"}}org.clazzes.jdbc2xml.schema.TableInfo{{/code}}) Objects, from which a database will be created if it finds an empty database. To function properly, it also needs an implementation of ISchemaEngine ({{code language="none"}}org.clazzes.jdbc2xml.schema.ISchemaEngine{{/code}}). 68 68 69 -Optionally, a base version (default value 0.1.00) and abase description String (default "initial database schema")may be specified.18 +Optionally, you may set the base version (default value 0.1.00) and base description String (default "initial database schema"). 70 70 71 71 Database updates are passed as a Map<String, ISchemaUpdateSnippet> (org.clazzes.jdbc2xml.schema.ISchemaUpdateSnippet) - details see below. 72 72 73 73 To perform the operations, call {{code language="none"}}SchemaManager.start(){{/code}}. 74 74 75 -=== {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets- ConfigurationusingSpringorOSGi/Blueprint"/}}Configuration using Spring or OSGi/Blueprint ===24 +=== {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-UsingSpringorOSGi/Blueprint"/}}Using Spring or OSGi/Blueprint === 76 76 77 77 If you are using OSGi with Blueprint or Spring to set up your project, you can configure a SchemaManager instance by adding the following to your blueprint {{code language="none"}}services.xml{{/code}} (or Spring configuration file): 78 78 ... ... @@ -84,7 +84,7 @@ 84 84 </bp:reference> 85 85 86 86 <bp:bean id="sqlDialect" factory-ref="dialectFactory" factory-method="newDialect"> 87 -<bp:argument ref="jdbcUrl"><!--beanjdbcUrlspecifiedabove -->36 +<bp:argument> <!-- Pass JDBC URL as an argument --> 88 88 </bp:argument> 89 89 </bp:bean> 90 90 ... ... @@ -92,46 +92,28 @@ 92 92 <bp:property name="dialect" ref="sqlDialect"> 93 93 </bp:property> 94 94 </bp:bean> 95 - 96 96 97 -<bp:bean id="initialSchema" class="foo.schema.InitialSchema"></bp:bean> 98 - 99 99 <bp:bean id="databaseSetup" class="org.clazzes.jdbc2xml.schema.SchemaManager" init-method="start"> 100 100 <bp:property name="dataSource" ref="dataSource"></bp:property> 101 101 <bp:property name="schemaEngine" ref="schemaEngine"></bp:property> 102 - <!-- optional but recommended: special name for schema history table: --> 103 - <bp:property name="versionHistoryTable" value="MYLIB_SCHEMA_HISTORY"/> 104 - <!-- optional but recommended: explicit first version --> 105 105 <bp:property name="baseVersion" value="0.1.00" /> 106 106 <bp:property name="baseTables"> 107 -<!-- List of TableDefinitions here (see below), typical: --> 108 - <bp:bean factory-ref="initialSchema" factory-method="getSchema" /> 50 +<!-- Add List of TableDefinitions here (see below) --> 109 109 </bp:property> 110 - <!-- Add Update-Snippets here, example for updates from 0.1.00 to 0.1.01 and on to 0.2.00 111 111 <bp:property name="upateSnippets"> 112 -<bp:map> 113 - <bp:entry key="0.1.00" value="foo.schema.SchemaUpdate_0_1_01"></bp:entry> 114 - <bp:entry key="0.1.01" value="foo.schema.SchemaUpdate_0_2_00"></bp:entry> 115 -</bp:map> 53 +<!-- Add Update-Snippets here --> 116 116 </bp:property> 117 - --> 118 118 </bp:bean> 119 119 {{/code}} 120 120 121 -By default, JDBC2XML provides an implementation of IDialectFactory and ISchemaEngineFactory as an OSGi service or via ServiceRegistry for Spring. 58 +By default, JDBC2XML provides an implementation of IDialectFactory and ISchemaEngineFactory as an OSGi service or via ServiceRegistry lookup for Spring. 122 122 123 123 = {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-Settingupaninitialdatabaseschema"/}}Setting up an initial database schema = 124 124 125 - === {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-InitalSchema(InitialTableList)"/}}Inital Schema(InitialTableList) ===62 +To create an initial database schema, you will need to provide SchemaManager with a list of TableInfo objects. The recommended way to do this is to provide a class in your project which creates this list in it's constructor and provides it through a getter. You can instantiate this class in your Spring/Blueprint config as a singleton, and feed the provided List to SchemaManager. An example of this class could look like this: 126 126 127 -To create an initial database schema, SchemaManager needs a list of TableInfo objects. 128 - 129 -The recommended strategy is to create an InitialSchema class providing this list through a getter. 130 - 131 -(% style="font-size: 10.0pt;line-height: 13.0pt;" %)This is an example: 132 - 133 133 {{code language="java"}} 134 -package foo.schema;65 +package org.clazzes.example.jdbc2xml; 135 135 136 136 import java.sql.Types; 137 137 import java.util.Arrays; ... ... @@ -142,31 +142,40 @@ 142 142 import org.clazzes.jdbc2xml.schema.PrimaryKeyInfo; 143 143 import org.clazzes.jdbc2xml.schema.TableInfo; 144 144 145 -public class InitialSchema{76 +public class TableDefinitions { 146 146 78 + // It is adviseable to provide the Strings used as names for tables and columns as constants, so they can be reused outside this object to build sql-statements 79 + public static final String TB_EXAMPLE_TABLE_NAME = "ADDRESSBOOK"; 80 + public static final String COL_EXAMPLE_ID = "ID"; 81 + public static final String COL_EXAMPLE_NAME = "NAME"; 82 + public static final String COL_EXAMPLE_ADDRESS_REF = "ADDRESS"; 83 + public static final String COL_EXAMPLE_BIRTHDAY = "BIRTHDAY"; 84 + 85 + // ... 86 + 147 147 private List<TableInfo> setup; 148 148 149 - public InitialSchema() {89 + public TableDefinitions() { 150 150 // Create a table 151 -TableInfo exampleTable = new TableInfo(T ableDefs.TABLENAME_ADDRESSBOOK);91 +TableInfo exampleTable = new TableInfo(TB_EXAMPLE_TABLE_NAME); 152 152 exampleTable.setColumns( 153 153 Arrays.asList(new ColumnInfo[] { 154 -new ColumnInfo( TableDefs.COL_ADDRESSBOOK_ID, Types.BIGINT, 20, null, false, null,true),155 -new ColumnInfo( TableDefs.COL_ADDRESSBOOK_NAME, Types.VARCHAR, 256, null, false, null),156 -new ColumnInfo( TableDefs.COL_ADDRESSBOOK_ADDRESS_REF, Types.BIGINT, 20, null, true, null),157 -new ColumnInfo( TableDefs.COL_ADDRESSBOOK_BIRTHDAY, Types.DATE, 12, null, false, null)94 +new ColumnInfo(COL_EXAMPLE_ID, Types.BIGINT, 20, null, false, null,true), 95 +new ColumnInfo(COL_EXAMPLE_NAME, Types.VARCHAR, 256, null, false, null), 96 +new ColumnInfo(COL_EXAMPLE_ADDRESS_REF, Types.BIGINT, 20, null, true, null), 97 +new ColumnInfo(COL_EXAMPLE_BIRTHDAY, Types.DATE, 12, null, false, null) 158 158 })); 159 159 160 -// Example for creating a primary key 161 -exampleTable.setPrimaryKey( 162 -new PrimaryKeyInfo("PK_EXAMPLE", COL_ADDRESSBOOK_ID) 163 -); 164 - 165 165 // Example for creating a foreign key reference 166 166 exampleTable.setForeignKeys(Arrays.asList(new ForeignKeyInfo[] { 167 -new ForeignKeyInfo("FK_EXAMPLE_ADDRESS", TableDefs.COL_ADDRESSBOOK_ADDRESS_REF, TableDefs.TABLENAME_ADDRESSES,TableDefs.COL_ADDRESS_ID)102 +new ForeignKeyInfo("FK_EXAMPLE_ADDRESS", COL_EXAMPLE_ADDRESS_REF, TB_ADDRESS, COL_ADDRESS_ID) 168 168 })); 169 169 105 +// Example for creating a primary key 106 +exampleTable.setPrimaryKey( 107 +new PrimaryKeyInfo("PK_EXAMPLE", COL_EXAMPLE_ID) 108 +); 109 + 170 170 // ... 171 171 172 172 this.setup = Arrays.asList( ... ... @@ -176,56 +176,23 @@ 176 176 177 177 } 178 178 179 - public List<TableInfo> getS chema() {180 -return this.s chema;119 + public List<TableInfo> getSetup() { 120 +return this.setup; 181 181 } 182 182 183 183 } 184 184 {{/code}} 185 185 186 - ==={{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-TableDefs,acentralplacefortableandcolumnnames"/}}TableDefs, acentral placefortable andcolumn names ===126 +You must inject {{code language="none"}}TableDefinitions.getSetup(){{/code}} into {{code language="none"}}SchemaManager.setBaseTables(){{/code}} before calling {{code language="none"}}SchemaManager.start(){{/code}}. 187 187 188 -You may have notice the usage of {{code language="none"}}TableDefs.*{{/code}} members. 189 - 190 -Table and column names should never be re-typed everywhere as literals, it is highly recommended to use constants. 191 - 192 -Putting these constants in a dedicated class, say {{code language="none"}}TableDef{{/code}}, allows to use this as an easily accessible list of all tables and columns in the database. 193 - 194 -This is an example: 195 - 196 -{{code language="java"}} 197 -package foo.schema; 198 - 199 -public class TableDefs { 200 - 201 - // It is adviseable to provide the Strings used as names for tables and columns as constants, 202 - // so they can be reused savely to construct SQL statements 203 - 204 - // 0.1.00 205 - public static final String TABLENAME_ADDRESSBOOK = "ADDRESSBOOK"; 206 - public static final String COL_ADDRESSBOOK_ID = "ID"; 207 - public static final String COL_ADDRESSBOOK_NAME = "NAME"; 208 - public static final String COL_ADDRESSBOOK_ADDRESS_REF = "ADDRESS"; 209 - public static final String COL_ADDRESSBOOK_BIRTHDAY = "BIRTHDAY"; 210 - // 0.1.01 211 -public static final String COL_ADDRESSBOOK_GENDER = "GENDER"; 212 - 213 -} 214 -{{/code}} 215 - 216 -=== {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-Triggeringthecreationoftheinitialschema"/}}Triggering the creation of the initial schema === 217 - 218 -(% style="font-size: 10.0pt;line-height: 13.0pt;" %)To trigger the creation of the initial schema when coming across an empty database, (% style="font-size: 10.0pt;line-height: 13.0pt;" %){{code language="none"}}InitialSchema.getSchema(){{/code}} has to be injected into (% style="font-size: 10.0pt;line-height: 13.0pt;" %){{code language="none"}}SchemaManager.setBaseTables(){{/code}} before calling (% style="font-size: 10.0pt;line-height: 13.0pt;" %){{code language="none"}}SchemaManager.start(){{/code}}. 219 - 220 220 Using Blueprint/Spring, you can do this by inserting the following snippet in the bean definition for SchemaManager: 221 221 222 222 {{code language="html/xml"}} 223 -<bp:bean id="initialSchema" class="foo.schema.InitialSchema"></bp:bean> 224 - 131 +<!-- SchemaManager bean definition starts here ... --> 225 225 <bp:property name="baseTables"> 226 -<bp:bean factory-ref="initi alSchema" factory-method="getSchema" />133 +<bp:bean factory-ref="tableDefinitions" factory-method="getSetup" /> 227 227 </bp:property> 228 - 135 +<!-- ... and continues here --> 229 229 {{/code}} 230 230 231 231 = {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-UpdatingadatabaseschemawithISchemaUpdateSnippet"/}}Updating a database schema with ISchemaUpdateSnippet = ... ... @@ -235,7 +235,7 @@ 235 235 An example for an implementation of a schema update snippet could look like this: 236 236 237 237 {{code language="java"}} 238 -package foo.schema;145 +package org.clazzes.example.jdbc2xml.updates; 239 239 240 240 import java.sql.SQLException; 241 241 import java.sql.Types; ... ... @@ -246,11 +246,15 @@ 246 246 import org.clazzes.jdbc2xml.schema.PrimaryKeyInfo; 247 247 import org.clazzes.jdbc2xml.schema.TableInfo; 248 248 249 -public class SchemaUpdate _0_1_01 implements ISchemaUpdateSnippet {156 +public class SchemaUpdate0_1_01 implements ISchemaUpdateSnippet { 250 250 251 251 // This is only accessed through the getter 252 252 private static final String TARGET_VERSION = "0.1.01"; 253 253 161 +// Here it is also adviseable to define constants for reuse in statements. 162 +public static final String COL_EXAMPLE_GENDER = "GENDER"; 163 + 164 + 254 254 @Override 255 255 public String getTargetVersion() { 256 256 return TARGET_VERSION; ... ... @@ -258,13 +258,13 @@ 258 258 259 259 @Override 260 260 public String getUpdateComment() { 261 -return "Adding column "+ TableDefs.COL_ADDRESSBOOK_GENDER+" to table "+TableDefs.TABLENAME_ADDRESSBOOK+".";172 +return "Adding column "+COL_EXAMPLE_GENDER+" to table "+TableDefinitions.TB_EXAMPLE_TABLE_NAME+"."; 262 262 } 263 263 264 264 @Override 265 265 public void performUpdate(ISchemaEngine schemaEngine) throws SQLException { 266 -TableInfo ti = schemaEngine.fetchTableInfo(TableDefs.T ABLENAME_ADDRESSBOOK, null);267 -schemaEngine.addColumn(ti, new ColumnInfo( TableDefs.COL_ADDRESSBOOK_GENDER, Types.VARCHAR, 1, null, true, null));177 +TableInfo ti = schemaEngine.fetchTableInfo(TableDefinitions.TB_EXAMPLE_TABLE_NAME, null); 178 + schemaEngine.addColumn(ti, new ColumnInfo(COL_EXAMPLE_GENDER, Types.VARCHAR, 1, null, true, null)); 268 268 } 269 269 } 270 270 ... ... @@ -271,7 +271,7 @@ 271 271 272 272 {{/code}} 273 273 274 -The return values of {{code language="none"}}ISchemaUpdateSnippet.getTargetVersion(){{/code}} and {{code language="none"}}ISchemaUpdateSnippet.getUpdateComment(){{/code}} are written to the {{code language="none"}}SCHEMA_HISTORY{{/code}} table. The update itself is performed in {{code language="none"}}ISchemaUpdateSnippet.performUpdate(){{/code}}. In the above example, it adds a column called {{code language="none"}}GENDER{{/code}} to the ADDRESSBOOKtable createdviatheInitialSchemaclass above.185 +The return values of {{code language="none"}}ISchemaUpdateSnippet.getTargetVersion(){{/code}} and {{code language="none"}}ISchemaUpdateSnippet.getUpdateComment(){{/code}} are written to the {{code language="none"}}SCHEMA_HISTORY{{/code}} table. The update itself is performed in {{code language="none"}}ISchemaUpdateSnippet.performUpdate(){{/code}}. In the above example, it adds a column called {{code language="none"}}GENDER{{/code}} to the example table created by the TableDefinitions class above. 275 275 276 276 To add an entire table you would use the {{code language="none"}}ISchemaEngine.createTable(){{/code}} method, like this: 277 277 ... ... @@ -280,12 +280,12 @@ 280 280 public void performUpdate(ISchemaEngine schemaEngine) throws SQLException { 281 281 TableInfo tiGroup = new TableInfo(TB_GROUP); 282 282 tiGroup.setColumns(Arrays.asList(new ColumnInfo[] { 283 - new ColumnInfo(TableDefs.COL_ID, Types.VARCHAR, 36, null, false, null), 284 - new ColumnInfo(TableDefs.COL_NAME, Types.VARCHAR, 100, null, false, null), 285 - new ColumnInfo(TableDefs.COL_DESCRIPTION, Types.VARCHAR, 512, null, true, null) 194 + new ColumnInfo(TableDefinitions.COL_ID, Types.VARCHAR, 36, null, false, null), 195 + new ColumnInfo(TableDefinitions.COL_NAME, Types.VARCHAR, 100, null, false, null), 196 + new ColumnInfo(TableDefinitions.COL_DESCRIPTION, Types.VARCHAR, 512, null, true, null) 286 286 })); 287 - tiGroup.setPrimaryKey(new PrimaryKeyInfo(PK_GROUP, TableDefs.COL_ID)); 288 - tiGroup.setIndices(Arrays.asList(new IndexInfo(IDX_GROUP_01, TableDefs.COL_NAME, true, null))); 198 + tiGroup.setPrimaryKey(new PrimaryKeyInfo(PK_GROUP, TableDefinitions.COL_ID)); 199 + tiGroup.setIndices(Arrays.asList(new IndexInfo(IDX_GROUP_01, TableDefinitions.COL_NAME, true, null))); 289 289 290 290 schemaEngine.createTable(tiGroup, true); 291 291 } ... ... @@ -296,7 +296,7 @@ 296 296 {{code language="java"}} 297 297 @Override 298 298 public void performUpdate(ISchemaEngine schemaEngine) throws SQLException { 299 - String sql = "UPDATE "+TableDefs.TB_EXAMPLE_TABLE_NAME+" SET "+TableDefs.COL_EXAMPLE_NAME+"=?"; 210 + String sql = "UPDATE "+TableDefinitions.TB_EXAMPLE_TABLE_NAME+" SET "+TableDefinitions.COL_EXAMPLE_NAME+"=?"; 300 300 301 301 PreparedStatement ps = schemaEngine.getConnection().prepareStatement(sql); 302 302 ... ... @@ -319,48 +319,14 @@ 319 319 <!-- ... and continues here --> 320 320 {{/code}} 321 321 322 - ={{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-SchemaMaintainanceStrategies"/}}Schema Maintainance Strategies =233 + 323 323 324 - TheJDBC2XML Schema management tools allow for 2 different strategies:235 + 325 325 326 - ==={{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-Frozen(Initial)TableList"/}}Frozen (% style="font-size: 14.0pt;" %)(Initial) Table List(%%) ===237 + 327 327 328 - Thelegacy strategy is:239 + 329 329 330 -(% style="list-style-type: square;" %) 331 -* At the start of a project, create and use {{code language="none"}}InitalSchema.java{{/code}} 332 -* After the first commit, {{code language="none"}}InitalSchema{{/code}} are considered frozen, all changes go into {{code language="none"}}SchemaUpdates{{/code}}, up to one update per source code commit 241 + 333 333 334 -Advantage: Rock solid. 335 - 336 -Disadvantage: No place to look for the complete and exact current scheme, except actual databases. {{code language="none"}}TableDefs.java{{/code}} provide some information, but may become confusing in the long term. 337 - 338 -=== {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-Possiblebutdangerous:Evolving(Initial)TableList"/}}Possible but dangerous: Evolving (Initial) Table List === 339 - 340 -To keep the (Initial) Schema up do date, one might use this strategy: 341 - 342 -(% style="list-style-type: square;" %) 343 -* keep the {{code language="none"}}InitalSchema{{/code}} up to date, so an empty database always gets the current scheme in one shot 344 -* {{code language="none"}}SchemaUpdates{{/code}} are only applied to existing databases 345 - 346 -Advantage: Immediate overview over exact current scheme. 347 - 348 -Disadvantage: Very real danger of messing something up, because 349 - 350 -(% style="list-style-type: square;" %) 351 -* schema updates have to be coded in 2 different places in 2 different ways 352 -* the bean definition has to be maintained in 2 places but just 1 353 - 354 -Conclusion: **DO NOT DO THIS**. This strategy may be ok in very early stages, but at some point it has to be 355 - 356 -=== {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-Recommendation:FreezeInitialTableDefinitionnotlaterthanthefirstReleaseCandidate(RC)"/}}(% style="font-size: 14.0pt;" %)Recommendation: Freeze Initial Table Definition not later than the first Release Candidate (RC)(%%) === 357 - 358 -It may be ok to start a new project using a fast changing (% style="font-size: 10.0pt;line-height: 13.0pt;" %)(Initial) Table List. 359 - 360 -(% style="font-size: 10.0pt;line-height: 13.0pt;" %)But, please, freeze it at some point. Once the first test server is setup up, internally or at a friendly customer, the Frozen Initial Table List Strategy is the only valid one! 361 - 362 -= {{id name="HowTocreateandupdateDatabasesusingSchemaManagerandSchemaUpdateSnippets-RealworldExample"/}}Real world Example = 363 - 364 -This HowTo is currently evolving while an additional developer gets acostumed to the SchemaEngine, for developing [[SDS' org.clazzes.sds.impl.schema package>>url:http://svn.clazzes.org/svn/sds/trunk/sds.impl/src/main/java/org/clazzes/sds/impl/schema||style="font-size: 10.0pt;line-height: 13.0pt;" shape="rect"]](% style="font-size: 10.0pt;line-height: 13.0pt;" %) which is **work in progress**! 365 - 366 -(% style="font-size: 10.0pt;line-height: 13.0pt;" %)\\ 243 +
- Confluence.Code.ConfluencePageClass[0]
-
- Id
-
... ... @@ -1,1 +1,1 @@ 1 -656 7901 +656821 - URL
-
... ... @@ -1,1 +1,1 @@ 1 -https://clazzes.atlassian.net/wiki/spaces/JDBC2XML/pages/656 790/How To create and update Databases using SchemaManager and SchemaUpdateSnippets1 +https://clazzes.atlassian.net/wiki/spaces/JDBC2XML/pages/656821/How To create and update Databases using SchemaManager and SchemaUpdateSnippets