Я новичок в 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 можно было использовать с другими технологиями
Это только школьное задание, так что Это должен быть самый продвинутый проект. Я также новичок в использовании дженериков таким образом, поэтому, пройдя мимо этого, я получу больше знаний о том, как они работают!