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);

创建两个实例变量并设置 SQL_FIND_BY_ID 的值,然后:

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

创建两个新的实例变量并将更改两个实例的值“SQL_FIND_BY_ID”。

于 2012-09-19T14:49:16.313 回答
0

如果没有更详细的错误描述,我现在或多或少地猜测,但从变量名称和代码片段来看,我怀疑静态字段 SQL_FIND_BY_ID 是原因。

当你实例化两个 DAO 时,构造函数 BaseDAOImpl 的第二次执行将覆盖静态字段的值。如果 DAO 依赖存储在那里的 SQL 查询,它总是会查询最后一个实例化的 DAO 的实体。

静态字段和方法在类的所有实例之间共享,即使它们的泛型参数不同。与例如 C++ 的模板相比,没有为每个通用参数生成单独的类。

要为每个实体实现单独查询的所需行为,您可以将静态字段更改为非静态成员。

于 2012-09-19T15:09:34.640 回答