2013-07-28 2 views
1

Я начинаю большие приложения с пружиной, спящим, maven, jpa, springMVC. На данный момент у меня есть 30 классов. (с интерфейсом для каждого класса у нас есть 60 классов) У меня есть два пакета. (Дао и сервис) Для dao я использую класс genericDao. Мой Classe аннотация для всех Dao является:CRUD с общими классами (dao, service)

> 
package org.me.dao.jpageneric; 

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.Query; 
  
import org.apache.log4j.Logger; 
  
public abstract class GenericDAO<T, K> { 
  
     @PersistenceContext(unitName="database") 
     protected EntityManager em; 
  
     protected Logger logger=Logger.getLogger(getClass()); 
  
     public abstract Query getByIdQuery(K id); 
     public abstract Query getAllQuery(); 
  
     public T save(T saved) { 
       if (saved == null) { 
        throw new IllegalArgumentException("L'argument de save() ne doit pas être nul."); 
       } 

       return (T) em.merge(saved); 
     } // save() 
  
     public void delete(T deleted) { 
       if (deleted == null) { 
        throw new IllegalArgumentException("L'argument de delete() ne doit pas être nul."); 
       } 
       em.remove(deleted); 
     } // delete(). 
  
     @SuppressWarnings("unchecked") 
     public T get(K id) { 
       if (id == null) { 
        throw new IllegalArgumentException("L'argument de get() ne doit pas être nul."); 
       } 
       Query query = getByIdQuery(id); 
       return (T) query.getSingleResult(); 
     } 
     @SuppressWarnings("unchecked") 
     public List<T> getAll() { 
       logger.debug("Récupération de tous les objets"); 
       Query query = getAllQuery(); 
       return (List<T>) query.getResultList(); 
     } 

Каждый Dao обязательно проходит этот Classe и implemente его интерфейс (и я должен сделать это для 30 других классов). Надеюсь, это хорошая практика.

После этого у меня есть еще один абстрактный общий класс для классов услуг.

package org.me.service.generic; 
  
import java.util.List; 
  
public abstract class GenericService<T,K> { 
  
     public abstract T create(T saved); 
     public abstract void remove(T deleted); 
     public abstract T findById(K id) ; 
     public abstract List<T> findAll(); 
  
} 

ей одно и то же, все службы Classe должны расширить этот общий класс обслуживания и реализовать интерфейс каждого Классе. Это хорошая практика снова?

Из корня у меня есть интерфейс для каждого класса (пакеты dao и службы).

Другой вопрос: мне нужно создавать контроллеры, как я это делаю? Чтобы создать контроллер для каждого класса (скажем, 30 контроллеров?) и как делать со страницами html и jsp? Спасибо. А жаль мой английский плохо :-)

+0

Услуги и контроллеры должны внедрять прецеденты вашего приложения. Они не должны содержать произвольные методы создания, удаления и поиска. Допустим, вы внедряете приложение Банка. Вы действительно не хотите перечислять все учетные записи (которые могут быть миллионы) или все клиенты, не так ли? Кроме того, JPA имеет 'EntityManager.find()' для получения объекта по ID. Используйте это, а не запрос. –

+0

thnks для этой информации. я изменил то, что вы говорите! более легкий и очень полезный. мое заявление касается посольства, агентства путешествий и министерства иностранных дел. –

ответ

0

Некоторые из хорошо считается хорошей практикой в ​​программировании программного обеспечения являются:.

  • DRY (Donot Repeat Yourself). Если вы много раз копируете один и тот же код, это просто ошибка, ожидающая своего появления, особенно когда приходит время рефакторировать (изменять) этот повторяющийся код.
  • Не изобретайте велосипед. Посмотрите на проекте Spring Data JPA, есть уже вы можете использовать

Как контроллеры Spring MVC, я не понимаю, почему вы должны суперкласс всего контроллера. Вам просто нужно аннотировать каждый класс контроллера @Controller. Это хорошая идея для инкапсуляции бизнес-функций, выполняемых контроллерами в классах Service, чтобы их можно было повторно использовать в других местах.

+0

как известно: мое приложение насчитывает 30 объектов. Я уже попробовал Spring Data JPA, но мне нужно написать каждый метод, реализованный для всех DAO (30 классов). с моими решениями я не должен этого делать. только сделать, например: public class AddressDAO extend GenericDao реализует IAddress {и мне не нужно писать какой-либо метод в AddressDAO.но с JpaRepository я должен написать весь метод и для всех классов. Надеюсь, это правильно, моя концепция. если вы видите ошибки, не стесняйтесь. благодаря контроллерам: я должен создать 30 классов контроллеров? или только один контроллер для всех классов? thakns –

+0

Я попробую spring-data-jpa –

+0

Просто упомянем: вы также можете использовать дженерики на уровне контроллера. Один простой контроллер для операций CRUD для основных данных, который получает имя и идентификатор класса из переменной pathvariable или requestparameter, легко достижим. –

2

Spring-data-jpa заменяет ваш GenericDAO.

Вы можете посмотреть spring-data-rest для ваших услуг crud.

В качестве альтернативы, я рекомендую посмотреть на весенний рой, который подстраивает веб-интерфейс пользователя для работы в рулонах.

+0

спасибо. да, есть много чего, что я не понял с помощью spring-data-jpa! наконец, он очень прост в использовании. еще один вопрос: можно добавить весенние данные-отдых в spring-data-jpa? Я видел весенний рой, это очень интересно, но я боюсь со всеми рамками. Возможно работать с spring-data-jpa, spring-data- отдых и рой? –

+0

spring-data-rest основывается на spring-data-jpa, поэтому, когда у вас есть spring-data-jpa на месте, вы можете работать с пружинными данными. весна-данные-отдых и весна-роа не будут работать хорошо вместе, я думаю. – Solubris

+0

ОК. Я попробую. спасибо –

Смежные вопросы