[Seasar-user:22153] Re: 【DBFlute】自動生成クラスの挙動について

kubo [E-MAIL ADDRESS DELETED]
2017年 12月 12日 (火) 11:10:04 JST


久保(jflute)です

成田さん、情報ありがとうございます。

>  * [foreign table]
> - *     Hoge1, Hoge2
> + *     Hoge2, Hoge1
なるほど、FKテーブルのメタデータの順序ですね。
一応、プログラム的には順序を保持するようにしているのですが...
メタデータの流れとしては以下のようになっています。

1. Oracle JDBCからFK情報を取得
 => DfForeignKeyExtractor
 => このとき、内部的にソートし直している (immobilizeOrder()) ★ポイント
https://github.com/dbflute/dbflute-core/blob/master/dbflute-engine/src/main/java/org/dbflute/logic/jdbc/metadata/basic/DfForeignKeyExtractor.java#L104

2. SchemaXmlに保存
 => 基本的にそのままの順序でXMLに保存
https://github.com/dbflute/dbflute-core/blob/master/dbflute-engine/src/main/java/org/dbflute/logic/jdbc/schemaxml/DfSchemaXmlSerializer.java#L653

3. SchemaXmlを読み込んでTable.javaで保持
 => XMLの順序をそのままキープ
https://github.com/dbflute/dbflute-core/blob/7ff330c93ad05dc5ab7a69d28957c290989c793e/dbflute-engine/src/main/java/org/apache/torque/engine/database/model/Table.java#L1210

※リンクはJava8版へのリンクですが、
その辺のロジックはほとんど変わってないはずで。

こちらの Oracle でのテスト環境では、
何度 renewal しても変わったことがないので、
ちょっと原因不明な状態です。
(動作に支障はないにせよ、紛らわしいですよね)


もし、分かれば以下の状況を教えて頂けると嬉しいです。

A. 同じ人がローカルで何度か renewal すると入れ替わる?

B. 別の人が renwal すると入れ替わる?

C. FK制約の名前は固定化されています? (SYSXXXではなく)
 => FK制約が関係しているかどうかの切り分け

D. SchemaXML (DBFluteクライアントのschemaフォルダの下のxml) も差分出てる?
 => XMLの前から入れ替わってるのか、XMLの後で入れ替わってるのかの切り分け


FK制約名を使ってないわけではないないのですが、
ただ、ソートの優先度は低いのでFKカラムが変わってなければ、
変わらないはずではありますが...

// DfForeignKeyExtractor
protected Comparator<String> createImmobilizedComparator(final
Map<String, DfForeignKeyMeta> fkMap) {
    return new Comparator<String>() {
        public int compare(String o1, String o2) {
            // sorted by "column names + FK name" (overridden default
sort is by FK name)
            // because FK name might be auto-generated name by DBMS,
            // no change FK but generated classes might be changed
after ReplaceSchema
            // (basically FK name should be named fixedly...)
            // so uses local column names as first key here
            final DfForeignKeyMeta meta1 = fkMap.get(o1);
            final DfForeignKeyMeta meta2 = fkMap.get(o2);
            final Map<String, String> columnNameMap1 =
meta1.getColumnNameMap(); // the map is sorted
            final Map<String, String> columnNameMap2 = meta2.getColumnNameMap();
            final String exp1 =
Srl.connectByDelimiter(columnNameMap1.keySet(), "/") + "," + o1;
            final String exp2 =
Srl.connectByDelimiter(columnNameMap2.keySet(), "/") + "," + o2;
            return exp1.compareTo(exp2);
        }
    };
}


Seasar-user メーリングリストの案内