Как работает entityClass в AbstractGenericDao? - PullRequest
0 голосов
/ 08 июня 2019

Следующий код в одном из моих офисов проектов?

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.lang.reflect.ParameterizedType;

import org.hibernate.Session;
import org.springframework.transaction.annotation.Transactional;

import com.sha.microservicecoursemanagement.model.IModel;

@Transactional
public class AbstractGenericDao<T extends IModel> implements IGenericDao<T> {

	    @PersistenceContext
	    protected EntityManager em;

	    protected Class<T> entityClass =
	            (Class<T>) ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

	    @Override
	    public T find(Long id) {
	        return em.find(entityClass, id);
	    }

	    @Override
	    public List<T> findAll() {
	        try {

	            final List<T> resultList =
	                    (this.em.createQuery("SELECT v FROM " + this.entityClass.getCanonicalName() + " v").getResultList());
	            return resultList;
	        }
	        catch(final RuntimeException e) {
	            e.printStackTrace();
	        }
	        return null;
	    }

	    @Override
	    public void save(T entity) {
	        em.persist(entity);
	    }

	    @Override
	    public T update(T entity) {
	        return em.merge(entity);
	    }
	    
	    @Override
	    public void delete(final Long id) {
	        em.remove(findReference(id));
	    }
	    
	    @Override
	    public T findReference(final Long id) {
	        return em.getReference(entityClass, id);
	    }
	    
	    @Override
	    public Session getSession() {
	        return (Session) this.em.getDelegate();
	    }

}

У меня так много вопросов, сначала посмотрите код ниже:

В приведенном выше коде: (1) Что означает следующая строка?

protected Class<T> entityClass =
                (Class<T>) ((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

Что на самом деле мы делаем в приведенной выше строке кода? Что такое «ParameterizedType», для чего мы делаем «getGenericSuperClass ()». Что такое getActualTypeAruments. Почему мы берем [0] -й элемент?

(2) Что делает em.persist? (3) Что делает em.merge? (4) Что делает метод findReferece? (5) Что делает метод getSession? К какому сеансу он возвращается?

Пожалуйста, помогите, я новичок в Java!

1 Ответ

0 голосов
/ 10 июня 2019

Java хранит информацию общего типа о суперклассе, и вы можете получить ее через Class.getGenericSuperclass().

Поскольку ваш AbstractGenericDao предназначен для наследования, this.getClass() всегда будет возвращать подтип AbstractGenericDao.Это означает, что this.getClass().getGenericSuperclass() даст вам полный универсальный тип AbstractGenericDao, например, что-то вроде AbstractGenericDao<Book>.Поскольку вы знаете, AbstractGenericDao является параметризованным типом (он имеет параметр типа T), вы можете привести его к ParameterizedType, а затем получить фактический тип T, например, Book, вызвав getActualTypeArguments()[0] (как T - первый и единственный параметр).По сути, это трюк, чтобы получить фактический тип сущности в DAO.

Теперь, как написано, этот код содержит ошибки.AbstractEntityDao не является абстрактным, и может быть создан непосредственно, что порвет эту строку, потому что его общий суперкласс будет Object.Более того, если какой-то класс не расширяет AbstractEntityDao напрямую, но через еще один класс, эта строка, скорее всего, снова оборвется, поскольку суперкласс будет чем-то отличным от AbstractEntityDao.

Что касается вашегодругие 4 вопроса - persist сохраняет ( сохраняется ) объект в БД.merge обновляет его в БД.Все это базовые концепции JPA / Hibernate, о которых вы узнаете за 5 минут чтения любого учебного пособия.Так что сделайте свое собственное исследование, прежде чем спрашивать, и не задавайте 5 вопросов в одном сообщении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...