マイグレーション処理の流れ
d:id:nattou_curry_2:20081108:1226139684では、マイグレーション時のインデックスDDL作成について少し調べました。
今回はもう少し範囲を広げて、ソースの内容からマイグレーション処理の流れを調べてみました。対象のクラスはnet.java.ao.schema.SchemaGeneratorです。(ちなみに、このクラスはAcitveObjectsの公開APIではありません。)
以下、SchemaGeneratorの主要な関数毎に、処理の流れを記載しました。なお、依存関係に関する処理は言葉で書くと複雑なので、詳細は省略しました。依存関係については、余力があれば後で図解します。
エンティティインタフェースのマイグレーションを行う。
public static void migrate()
エンティティインタフェースからSQL文を生成する。
private static String[] generateImpl()
エンティティインタフェースを解析してDDLを作成する。
static DDLTable[] parseDDL()
エンティティインタフェースを解析して依存関係を取得する。
private static void parseDependencies()
- すべてのエンティティインタフェースについて繰り返す。
- エンティティインタフェースのすべてのメソッドについて繰り返す。
- 以下をすべて満たすことを確認する。
- メソッドから属性名を取得できること。
- メソッドから属性型を取得できること。
- メソッドから取得した属性型がエンティティであること。
- エンティティインタフェースから、メソッドから取得した属性型への、依存関係を作成する。(詳細は省略)
- 以下をすべて満たすことを確認する。
- エンティティインタフェースのすべてのメソッドについて繰り返す。
エンティティインタフェースを解析してテーブルDDLを作成する。
private static DDLTable parseInterface()
エンティティインタフェースを解析してフィールドDDLを作成する。
private static DDLField[] parseFields()
- エンティティインタフェースのすべてのメソッドについて繰り返す。
- メソッドが以下のアノテーションを一切持たないことを確認する。
- 以下をすべて満たすことを確認する。
- メソッドから属性名を取得できる。
- メソッドから属性型を取得できる。
- 未処理の属性型であることを確認する。
- 処理済みである:次の繰り返しに進む。
- メソッド用のフィールドを作成する。
- メソッドがPrimaryKeyアノテーションを持つことを確認する。
- メソッド用のフィールドを主キーにする。
- メソッドがNotNullアノテーションを持つことを確認する。
- メソッド用のフィールドを非nullにする。
- メソッドがUniqueアノテーションを持つことを確認する。
- メソッド用のフィールドをユニークにする。
- メソッドがAutoIncrementアノテーションを持つことを確認する。
- メソッド用のフィールドをオートインクリメントにする。
- メソッドがAutoIncrementアノテーションを持たない: メソッドがDefaultアノテーションを持つことを確認する。
- メソッド用のフィールドのデフォルト値として、AutoIncrementアノテーションの値を設定する。
- メソッドがOnUpdateアノテーションを持つことを確認する。
- メソッド用のフィールドの更新イベントを受け取るフィールドとして、OnUpdateアノテーションの値を設定する。
- 以下をすべて満たすことを確認する。
- 未処理の属性型であることを確認する。
エンティティインタフェースを解析して外部キーDDLを作成する。
private static DDLForeignKey[] parseForeignKeys()
- エンティティインタフェースのすべてのメソッドについて繰り返す。
- 以下をすべて満たすことを確認する。
- メソッドから属性型を取得できる。
- メソッドから属性名を取得できる。
- メソッドの属性型がエンティティである。
- メソッドの属性型がPolymorphicアノテーションを持たない。
- 外部キーを作成する。
- 以下をすべて満たすことを確認する。
エンティティインタフェースを解析してインデックスDDLを作成する。
private static DDLIndex[] parseIndexes()