【问题标题】:Generics with Hibernate when should I have to use criteria?什么时候应该使用 Hibernate 的泛型?
【发布时间】:2016-10-10 05:42:58
【问题描述】:

我尝试在我的代码中使用泛型。 我有从 BD 获取信息的 Dao:

@Component
public class BasicDAOImpl<T> implements BasicDAO<T> {
    private Class<T> type;

    public BasicDAOImpl(Class<T> type) {this.type = type;
    }

    public BasicDAOImpl() {
    }

    @Autowired
    SessionFactory sessionfactory;

    @Override
    @Transactional
    public List<T> getAllByKey(int id) {
        List<T> list = new ArrayList<>();
        try{
            Session session = sessionfactory.getCurrentSession();
            Criteria criteria = session.createCriteria(type);
            criteria.add(Restrictions.eq("parentid", id));
           list.addAll(criteria.list());
        }catch (HibernateException e){}

        return list;
    }

我有: WorkoutDAOImpl 扩展 BasicDAOImpl

public class WorkoutDAOImpl extends BasicDAOImpl<Workout> implements WorkoutDAO {}

豆子:

@Bean
public WorkoutDAO workoutDAO(){
    return new WorkoutDAOImpl();
}

我写在我的代码中:

workoutDAO.getAllByKey(int 2)

并得到错误

java.lang.NullPointerException

Criteria criteria = session.createCriteria(type)

为什么? 如果写Criteria criteria = session.createCriteria(Workout.class),则不会出现任何错误。

PS/对不起或我的英语:)

【问题讨论】:

    标签: java spring hibernate generics dao


    【解决方案1】:

    Workout.class 没有从你的WorkoutDAOImpl 传递给BasicDAOImpl,所以Class&lt;T&gt; type 没有被初始化,你得到NullPointerException。添加无参数构造函数:

    public class WorkoutDAOImpl extends BasicDAOImpl<Workout> implements WorkoutDAO {
    
        public WorkoutDAOImpl() {
            super(Workout.class);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您需要调用BasicDAOImpl类的One Parameter Constructor来设置初始化type变量。

      1. WorkoutDAOImpl 类中创建一个无参数构造函数并调用超类构造函数,即 BasicDAOImpl,如下所示:
      公共类 WorkoutDAOImpl 扩展 BasicDAOImpl 实现 WorkoutDAO { 锻炼DAOImpl(){ 超级(锻炼。类); } }

      不过,您也可以使用反射来解决它。但是,按照您想要的方式,您必须显式调用 BasicDAOImpl 的构造函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 2011-04-15
        • 2017-04-10
        • 2012-03-19
        • 2018-05-12
        • 2018-12-11
        • 1970-01-01
        • 2022-09-28
        相关资源
        最近更新 更多