Как создать обобщенный c интерфейс и обобщенный c абстрактный класс для DAO в Hibernate? - PullRequest
0 голосов
/ 10 марта 2020

Я новичок в Hibernate и терминологии, которая идет с ним, а именно: DAO, Services, et c.

Из моего исследования я создал обобщенный c интерфейс DAO и абстрактный класс, который реализует интерфейс. Этот класс имеет обобщенные реализации метода c, которые затем можно распространить на классы DAO / entity, в моем случае, класс Stock. Вот мой код:

Дао. java

public interface Dao<E> {

    E findById(final long id);
    List<E> findAll();
    void createItem(final E entity);
    E update(final E entity);
    void delete(final E entity);
    void deleteById(final long id);

}

AbstractGenericDao. java

public class AbstractGenericDao<E> implements Dao<E> {

    private Class<E> persistentClass;
    private Session session;
    private Query query;

    @SuppressWarnings("unchecked")
    public AbstractGenericDao() {
        this.persistentClass = (Class<E>) ((ParameterizedType) getClass()
                                .getGenericSuperclass()).getActualTypeArguments()[0];
    }

    public Class<E> getPersistentClass() {
        return persistentClass;
    }

    public E findById(long id) {
        E entity = null;
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            entity = session.get(persistentClass, id);
            Hibernate.initialize(entity);
        } catch (HibernateException e) {
            if (session != null) session.getTransaction().rollback();
            e.printStackTrace();
        } finally {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }
        return entity;
    }

StockDaoTest. java

public class StockDaoTest extends AbstractGenericDao<Stock> {

    public static void main(String[] args) {
        Dao<Stock> dao = new AbstractGenericDao();
        Stock item = dao.findById(57);
        System.out.println(item.getName());
    }
}

При запуске моего StockDaoTest класса мне выдается следующая ошибка:

Исключение в потоке "main "java .lang.ClassCastException: класс java .lang.Class не может быть приведен к классу java .lang.reflect.ParameterizedType (java .lang.Class и java .lang.reflect.ParameterizedType являются в модуле java .base загрузчика 'bootstrap')

Этот код был взят и адаптирован из документации jBoss в Интернете, однако я пропустил использование идентификатора в списке параметров - мог что вызывает проблему? Я этого не делал, так как моя программа довольно проста c только с 2 классами DAO / сущностей с полями ID.

Как я хочу, чтобы программа работала:

  • Generi c интерфейс, описывающий операции CRUD для базы данных
  • Абстрактный класс, реализующий указанный интерфейс с обобщенными c реализациями метода
  • Класс DAO, расширяющий абстрактный класс с любой дополнительной спецификацией объекта c методы
  • Пользовательский интерфейс с графическим интерфейсом / консолью можно поместить поверх интерфейса, чтобы мой API можно было использовать с другими технологиями

Это только школьное задание, так что Это должен быть самый продвинутый проект. Я также новичок в использовании дженериков таким образом, поэтому, пройдя мимо этого, я получу больше знаний о том, как они работают!

...