Якийсь час я використовую наступне безпосередньо в сервісних класах:
@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {
}
Як альтернативу, я міг би побудувати AbstractDao розширений PersonDao. Ці класи будуть використовувати EntityManager
public abstract class AbstractDao<PK extends Serializable, T> {
private final Class<T> persistentClass;
@SuppressWarnings("unchecked")
public AbstractDao(){
this.persistentClass =(Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
}
@PersistenceContext
EntityManager entityManager;
public T findByKey(PK key) {
return entityManager.find(persistentClass, key);
}
public List<T> findAll() {
return entityManager.createQuery( "from " + persistentClass.getName()).getResultList();
}
public void save( T entity ){
entityManager.persist( entity );
}
Чи існує будь-яка функціональна різниця між цими підходами - крім більшого коду на пізнішій? Що змусить мене вибрати один над одним?
Відповіді:
1 для відповіді № 1Дані Spring Data у цьому випадку будуть охоплювати те, що ви маєте у другому прикладі. Інші схеми матимуть аналогічний підхід, приховуючи EntityManager і надаючи вам нестандартний API.
Немає різниці (з урахуванням лише результатів) між двома підходами і навіть вашою нотою крім більшого коду в пізнішій? це не так, оскільки я впевнений, що будь-яка структура матиме безліч рядків коду для підтримки операцій. :)