6

Spring JDBC を使用したクラス階層のマッピングに関して、コミュニティが「ベスト プラクティス」と見なしているものを知りたいと思いました。

本格的な ORM ツールを使用することはできませんが、Spring JDBC を使用して、JDBC の退屈な性質を軽減しています。非常に頻繁に利用するクラスの 1 つに BeanPropertyRowMapper があります。これは、使いやすさと、結果セットから型を区別しない Bean プロパティへのアクセスを可能にする機能のためです。

すべてが 1 つのテーブルにマップされるクラス階層があります (この小さなクラス階層では、階層ごとのテーブル アプローチを採用しています)。そのため、テーブルには、実際にインスタンス化する必要があるクラスを決定するために使用できる classId 列が含まれています。元。1 = マネージャー、2 = 従業員、3 = 請負業者。これらはすべて「人物」ですが、人物の各サブクラスには、そのクラスに固有のいくつかの属性があります。

私の最初の考えは、BeanPropertyRowMapper のサブクラスを作成し、このロジックを挿入して、「列 A = 1 の場合は Manager をインスタンス化し、通常のバインディングを実行する」ということです。

これは合理的なアプローチのように思えますか? あなたのために働いた他の提案はありますか?

4

2 に答える 2

4

サブクラスには、BeanPropertyRowMapper の mapRow() の実装を完全にコピーせずにクラスを切り替えるフックを追加できる場所がないようです。最善の方法は、適切な BeanPropertyRowMapper に委譲する RowMapper クラスを作成することです。

例えば:

    final RowMapper managerMapper = new BeanPropertyRowMapper(Manager.class);
    final RowMapper employeeMapper = new BeanPropertyRowMapper(Employee.class);
    final RowMapper contractorMapper = new BeanPropertyRowMapper(Contractor.class);

    RowMapper rm = new RowMapper()
    {
        @Override
        public Object mapRow(ResultSet rs, int rowNum)
            throws SQLException
        {
            int employeeType = rs.getInt("type");
            switch (employeeType)
            {
                case 1:
                    return managerMapper.mapRow(rs, rowNum); 

                case 2:
                    return employeeMapper.mapRow(rs, rowNum);

                case 3:
                    return contractorMapper.mapRow(rs, rowNum);

                default:
                    break;

            }
        }
    };
于 2009-12-02T20:00:21.257 に答える