[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 メーリングリストの案内