2012-02-09 2 views
1

저는 Java EE 6을 처음 접했고 Spring보다 새로운 버전입니다. 필자는 EclipseLink JPA EntityManager를 삽입하려고 시도하고 있으며 이것을 달성하는 여러 가지 방법을 모색 중이다. 글래스 피쉬와 더비를 사용하고 있습니다. 아래 예제에서 EntityManager를 간단하게 서블릿이나 컨트롤러에 삽입하려고합니다. 실제로는 EntityManager를 래핑하는 DAO 클래스가 있습니다. 다음 스프링 대 Java EE 6을 사용하여 JPA EntityManager 삽입

자바 EE 6에서, I는 서블릿을 정의 할 수

@WebServlet(urlPatterns="/app/*") 
public class FrontController extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    @PersistenceContext 
    private EntityManager entityManager; 
} 

EntityManager를 올바르게 추가 구성으로 주입된다.

이제 스프링을 이상적으로 주석을 통해 사용하고 싶습니다. 다음과 같이 현재, 나는 컨트롤러를 정의 할 수 있습니다 : 봄 내가 내 응용 프로그램 컨텍스트 XML 파일에 다음 지시문을 포함해야 제대로 일을 배선하기 위해서는

@Controller 
@RequestMapping("/testurl.htm") 
public class ExampleController { 
    private EntityManager em; 

    @PersistenceContext 
    public void setEntityManager(EntityManager em) { 
     this.em = em; 
    } 
} 

:

<bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="myPU"/> 
</bean> 

하는 경우 나는 위의 조각을 포함하지 않는, 내가 배포에 대한 예외를 얻을 : org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 0

this을 읽고서 나는 인상이었다 나는 위의 XML 조각을 필요가 없을 것입니다 . 위의 스 니펫이 항상 요구되는지 누구든지 확인할 수 있습니까?

또 다른 접근 방법이 있습니까? EntityManager가 Java EE 컨테이너에서 FrontController 서블릿에 성공적으로 삽입되면이 동일한 EntityManager를 Spring 응용 프로그램 컨텍스트에 삽입하고 다른 Spring Bean에서 어떻게 사용할 수 있습니까?

+2

는 서비스 계층으로 그들을하지 주입하여 컨트롤러 – NimChimpsky

답변

0

귀하의 컨트롤러가 아닌 서비스 레이어에 입력하십시오.

간단한 조각 (사용 hibernate4) :

@Controller 
public class AdminController { 

    @Resource(name = "companyService") 
    private CompanyService companyService; 

    @RequestMapping(value = "/AllCompanies", method = RequestMethod.GET) 
    public String getCompanies(final Model model) { 
    final List<Company> companies = companyService.getAllCompanies(); 
    //dostuff 
    } 

및 서비스 :

@Service("companyService") 
@Transactional 
public class CompanyService { 

    @Resource(name = "sessionFactory") 
    private SessionFactory sessionFactory; 

    @Transactional(readOnly = true) 
    public List<Company> getAllCompanies() { 
    final Session session = sessionFactory.getCurrentSession(); 
//... do stuff 
} 

및 응용 프로그램 컨텍스트의 관련 비트

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
     p:dataSource-ref="dataSource" p:configLocation="WEB-INF/classes/hibernate.cfg.xml" 
     p:packagesToScan="com.mypackage" /> 

    <!-- Declare a datasource that has pooling capabilities --> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
     ... /> 

    <!-- Declare a transaction manager --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
       p:sessionFactory-ref="sessionFactory" /> 
+0

고마워,하지만이게 내가 한 후에는 아니야. (내가 말했듯이, 나는 한번 DAO를 사출 작업으로 사용하려고한다. 에스). [link] (http://static.springsource.org/spring/docs/2.5.x/reference/orm.html#orm-jpa-straight)에 게시 된 'ProductDaoImpl'에는 Spring 종속성이 없습니다. 그들의 앱 컨텍스트 xml은 또한 엔티티 관리자 선언이 없으므로 기본 (JEE-container supplied?) 엔티티 관리자 팩토리가 사용된다는 것을 암시합니다. – zorgbargle

+0

@ zorgbargle a dao는 서비스 클래스/계층과 다르지만 컨트롤러에 주입하는 서비스 계층에 dao를 주입합니다. 봄 2.5 btw, 최대 3.1입니다. – NimChimpsky

+0

고마워, 나는 그들이 다르다는 것을 깨닫는다. 그러나 내가 여기에서하려고하는 것을 바꿀 것이라고 생각하지 않는다. 이것은 기본 주입 메커니즘을 작동시키는 것이다. 서비스 레이어를 소개한다면 스프링이 서비스 레이어를 만들려고 할 때와 똑같은 예외가 발생합니다. 편집 : 미안 해요 - 오직 두 번째 응답을 보았습니다. - AOP가 내가해야하는 /하지 말아야 할 바가 무엇인지 모르겠습니다. – zorgbargle

관련 문제