2013-07-28 5 views
1

나는 봄, 최대 절전 모드, 메이븐, jpa, springMVC로 큰 응용 프로그램을 시작합니다. 현재 30 개의 수업이 있습니다. (우리는 60 클래스가 각 클래스에 대한 인터페이스) 나는 두 개의 패키지가 있습니다. (DAO 및 서비스) DAO의 경우 genericDao 클래스를 사용합니다. 모든 다오에 대한 나의 CLASSE 개요는 다음과 같습니다일반 클래스 (dao, service)로 CRUD

> 
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(); 
     } 

모든 다오 반드시이 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(); 
  
} 

모든 서비스 클래스는 이러한 일반적인 서비스 클래스를 확장하고 각 클래스의 인터페이스를 구현해야합니다. 좋은 연습이 다시 있습니까?

나는 각 클래스 (패키지 DAO 및 서비스)에 대한 인터페이스를 가지고 있습니다.

또 다른 질문 : 나는 컨트롤러를 만들어야 만합니까? 각 클래스에 대한 컨트롤러를 생성하려면 (예 : 30 개의 컨트롤러를 말합니까?) 페이지 HTML 및 JSP를 사용하는 방법은 무엇입니까? 감사합니다. . 는 그리고 미안 내 영어는

+0

서비스 및 컨트롤러는 응용 프로그램의 유스 케이스를 구현해야합니다. 임의의 create, remove 및 find 메소드를 포함해서는 안됩니다. 은행 애플리케이션을 구현한다고 가정 해 보겠습니다. 당신은 정말로 모든 계좌 (수백만이 될 수 있음) 또는 모든 고객을 나열하고 싶지 않습니까? 또한 JPA는 EntityManager.find()를 사용하여 ID로 엔티티를 가져옵니다. 그 대신 쿼리를 사용하십시오. 해당 정보에 대해서는 –

+0

입니다. 나는 네가 한 말을 바꿨다! 더 쉽고 매우 유용합니다. 내 신청서는 대사관, 여행사 및 외무부를위한 것입니다. 알고 계신대로 –

답변

0

:-) 나쁜 소프트웨어 프로그래밍에서 잘 간주 좋은 방법 중 일부는 다음과 같습니다

  • DRY (자신을 반복이 donot). 동일한 코드를 여러 번 복사하면 반복되는 코드를 리팩터링 (변경) 할 때 특히 기다리고있는 버그 일뿐입니다.
  • 바퀴를 재발 명하지 마십시오. Spring Data JPA 프로젝트를 살펴보십시오. 이미 사용할 수 있습니다.

스프링 MVC 컨트롤러에서 모든 컨트롤러를 수퍼 클래스해야하는 이유는 알 수 없습니다. @Controller을 사용하여 각 컨트롤러 클래스에 주석을 달면됩니다. 다른 클래스에서 컨트롤러로 실행되는 비즈니스 기능을 캡슐화하여 다른 곳에서 재사용 할 수 있도록하는 것이 좋습니다.

+0

: 내 신청 건수는 30 개입니다. 나는 이미 봄 데이터 JPA를 시도하지만 모든 DAO (30 클래스)에 대해 구현 된 각 메소드를 작성해야한다. 내 솔루션으로 나는 그것을 할 필요가 없다. 예를 들면 다음과 같습니다 : public class AddressDAO extends GenericDao 는 IAddress {를 구현하고 AddressDAO에 어떤 메소드도 작성하지 않아도됩니다.JpaRepository를 사용하면 모든 메서드와 모든 클래스를 작성해야합니다. 내 생각이 옳았 으면 좋겠어. 실수를 보면 망설이지 마라. 컨트롤러 덕분에 : 나는 30 컨트롤러 클래스를 생성해야합니까? 또는 모든 클래스에 대해 하나의 컨트롤러 만 있습니까? thakns –

+0

나는 spring-data-jpa를 시도 할 것이다 –

+0

그냥 언급하자면 : 컨트롤러 레벨에서 제네릭을 사용할 수도있다. pathvariable 또는 requestparameter에서 클래스 이름과 ID를 가져 오는 마스터 데이터에 대한 CRUD 작업을위한 간단한 컨트롤러가 쉽게 구현할 수 있습니다. –

2

Spring-data-jpa가 GenericDAO를 대체합니다.

귀하는 귀하의 분노한 서비스에 대해 spring-data-rest을 볼 수 있습니다.

또는 스프링 조립식 웹 UI를 사용하여 까다로운 작업을 수행하는 것이 좋습니다.

+0

감사합니다. 네, 스프링 데이터 jpa로는 이해할 수 없었던 많은 것들이 있습니다! 마침내 사용하기가 매우 쉽습니다. 또 다른 질문은 스프링 데이터를 스프링 데이터에 추가하는 것이 가능하다는 것입니다. 스프링 롤을 보았는데 매우 흥미 롭습니다.하지만 모든 프레임 워크에 호의적이었습니다. 스프링 데이터 jpa, 스프링 데이터 jpa, 휴식과 로오? –

+0

spring-data-rest는 spring-data-jpa를 기반으로하므로 일단 spring-data-jpa를 사용하면 스프링 데이터를 사용할 수 있습니다. spring-data-rest와 spring-roo는 잘 작동하지 않을 것이라고 생각합니다. – Solubris

+0

확인. 나는 그것을 시도 할 것이다. 정보를 위해 –