Hatena::Groupseasarproject

S2できるかな?

2013-03-05

Java SE 6と7では、S2JDBC-Genで作られるDDLのスキーマが違う。#3

g:seasarproject:id:halflite:20130305:s2jdbcgen からの続き。

カラムの並び替えは、

org.seasar.extension.jdbc.gen.internal.desc.TableDescFactoryImplクラス

のdoColumnDescメソッドで行っているのですが、そこを

差し替えればできます。

[Seasar-user:17896] Re: S2JDBC-Gen の gen-ddl が生成する DDL での主キーのカラム順について

をヒントに、S2JDBC-Genのソースを落としてきて、Eclipseにインポート、該当のクラスのテストケースを探します。*1

    /**
     * 
     * @throws Exception
     */
    @Test
    public void testColumnDescList_multiClass() throws Exception {
        EntityMeta entityMeta = entityMetaFactory.getEntityMeta(Ggg.class);
        TableDesc tableDesc = tableDescFactory.getTableDesc(entityMeta);
        List<ColumnDesc> list = tableDesc.getColumnDescList();
        assertEquals(6, list.size());
        assertEquals("ID1", list.get(0).getName());
        assertEquals("ID2", list.get(1).getName());
        assertEquals("ID3", list.get(2).getName());
        assertEquals("NAME3", list.get(3).getName());
        assertEquals("NAME2", list.get(4).getName());
        assertEquals("NAME1", list.get(5).getName());
    }

上記テストケース、JDK 6だと通るんですが、JDK 7だと通りません。*2

カラムを並べ替えているComparator実装が原因っぽいです。*3

    /**
     * カラム記述の{@link Comparator}を作成します。
     * 
     * @param tableDesc
     *            テーブル記述
     * @return カラム記述の{@link Comparator}
     */
    protected Comparator<ColumnDesc> createColumnDescComparator(
            TableDesc tableDesc) {
        final List<String> pkColumnNameList = new ArrayList<String>();
        if (tableDesc.getPrimaryKeyDesc() != null) {
            PrimaryKeyDesc primaryKeyDesc = tableDesc.getPrimaryKeyDesc();
            pkColumnNameList.addAll(primaryKeyDesc.getColumnNameList());
        }
        return new Comparator<ColumnDesc>() {

            public int compare(ColumnDesc o1, ColumnDesc o2) {
                int index1 = pkColumnNameList.indexOf(o1.getName());
                int index2 = pkColumnNameList.indexOf(o2.getName());
                int ret = 0;
                if (index1 < 0) {
                    if (index2 < 0) {
                        ret = -1;
                    } else {
                        ret = 1;
                    }
                } else {
                    if (index2 < 0) {
                        ret = -1;
                    } else {
                        ret = index1 - index2;
                    }
                }
                return ret;
            }
        };
    }

ret = ... で定数を返すと、JDK 6/JDK 7でソートのロジック変わったので、それによって、挙動も変わってしまうようです。*4