0

多くの別々のDAOに多かれ少なかれ同じコードが含まれるのを避けるために、汎用DAOを作成しようとしています。

私の問題は、次のコード行にあることです。

private BaseDAOImpl<Artist> baseDAOArtist = new BaseDAOImpl<>(Artist.class);
private BaseDAOImpl<ArtistRelation> baseDAOArtistRelation = new BaseDAOImpl<>(ArtistRelation.class);

最初のものはスキップされているようです。

BaseDAOImplの抜粋:

public class BaseDAOImpl<T> implements BaseDAO<T> {

    private Class<T> entity;
    private DAOFactory daoFactory = Config.getInstance().getDAOFactory();
    private static String SQL_FIND_BY_ID;

    public BaseDAOImpl(Class entity) {
        this.entity = entity;
        SQL_FIND_BY_ID = "SELECT * FROM VIEW_" + entity.getSimpleName() + " WHERE id = ?";        
    }
}

この方法で複数のオブジェクトをインスタンス化することはできませんか?

4

2 に答える 2

1

はい。「最初のものはスキップされているようです」とはどういう意味かわかりません。しかし、「SQL_FIND_BY_ID」に静的な値を使用している可能性がありますか?現時点で:

private BaseDAOImpl<Artist> baseDAOArtist = new BaseDAOImpl<>(Artist.class);

2つのインスタンス変数を作成し、SQL_FIND_BY_IDの値を設定します。

private BaseDAOImpl<ArtistRelation> baseDAOArtistRelation = new BaseDAOImpl<>(ArtistRelation.class);

2つの新しいインスタンス変数を作成し、両方のインスタンスの値「SQL_FIND_BY_ID」を変更します。

于 2012-09-19T14:49:16.313 に答える
0

エラーの詳細な説明がなければ、私は多かれ少なかれ推測していますが、変数名とコードスニペットから判断すると、静的フィールドSQL_FIND_BY_IDが原因であると思われます。

2つのDAOをインスタンス化すると、コンストラクターBaseDAOImplの2回目の実行により、静的フィールドの値が上書きされます。DAOがそこに格納されているSQLクエリに依存している場合、DAOは常に最後にインスタンス化されたDAOのエンティティをクエリします。

静的フィールドとメソッドは、ジェネリックパラメーターが異なっていても、クラスのすべてのインスタンス間で共有されます。たとえばC++のテンプレートとは対照的に、ジェネリックパラメータごとに個別のクラスが生成されることはありません。

エンティティごとに個別のクエリの望ましい動作を実現するには、静的フィールドを非静的メンバーに変更します。

于 2012-09-19T15:09:34.640 に答える