2016-10-10 7 views
0

私のコードでジェネリックを使用しようとしました。 私はBDから情報を取得ダオありますHibernateを使用したジェネリックスはいつ基準を使用する必要がありますか?

@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 extende BasicDAOImpl

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

豆:

:私は私のコードで書く

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

workoutDAO.getAllByKey(int 2) 

Criteria criteria = session.createCriteria(type)でエラー

java.lang.NullPointerException 

を取得します。

なぜですか? Criteria criteria = session.createCriteria(Workout.class)を書き込むと、エラーは発生しません。

PS /申し訳ありませんか私の英語:)

答えて

0

Workout.classからBasicDAOImplに渡されていない、あなたのWorkoutDAOImplのでClass<T> typeが初期化され、あなたがNullPointerExceptionを取得されていません。引数なしのコンストラクタを追加します。

public class WorkoutDAOImpl extends BasicDAOImpl<Workout> implements WorkoutDAO { 

    public WorkoutDAOImpl() { 
     super(Workout.class); 
    } 
} 
0

あなたはタイプ変数を初期化設定するために、BasicDAOImplクラスの一つのパラメータコンストラクタを呼び出す必要があります。

  1. WorkoutDAOImplクラスの引数なしのコンストラクタを作成し、以下のように、すなわちBasicDAOImplスーパークラスのコンストラクタにを呼び出す:
 
public class WorkoutDAOImpl extends BasicDAOImpl implements WorkoutDAO { 
     WorkoutDAOImpl(){ 
     super(Workout.class); 
     } 

    } 

けれども、あなたはまた、それを解決するためにリフレクションを使用することができます。しかし、それをやりたいように、BasicDAOImplのConstructorを明示的に呼び出す必要があります。

関連する問題