我正在尝试创建一个通用的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 = ?";
}
}
是不可能以这种方式实例化多个对象?
答案 0 :(得分:1)
是。目前还不清楚你的意思是“第一个似乎被跳过了。”但可能是你使用“SQL_FIND_BY_ID”的静态值?截至目前:
private BaseDAOImpl<Artist> baseDAOArtist = new BaseDAOImpl<>(Artist.class);
创建两个实例变量,然后设置SQL_FIND_BY_ID的值:
private BaseDAOImpl<ArtistRelation> baseDAOArtistRelation = new BaseDAOImpl<>(ArtistRelation.class);
创建两个新的实例变量,并为两个实例更改值“SQL_FIND_BY_ID”。
答案 1 :(得分:0)
如果没有更详细的错误描述我现在或多或少猜测,但从变量名称和代码片段判断我会怀疑 static 字段SQL_FIND_BY_ID是原因。
当您实例化两个DAO时,构造函数BaseDAOImpl的第二次执行将覆盖静态字段的值。如果DAO依赖于存储在那里的SQL查询,它将始终查询最后一个实例化DAO的实体。
静态字段和方法在类的所有实例之间共享,即使它们的泛型参数不同。与例如在C ++的模板中,没有为每个泛型参数生成单独的类。
要为每个实体实现单独查询的所需行为,您可以将静态字段更改为非静态成员。