2013-03-09 5 views
1

나는 다음과 같은 아키텍처를 사용하여 Spring 애플리케이션에서 최대 절전 모드 DAO를 개발하고 열지 마십시오 :봄 + 최대 절전 모드가 자동으로 세션

내가 다음 CRUD에 내가 원하는 방법을 선언하는 PersonDAO 인터페이스가를 I

package org.andrea.myexample.HibernateOnSpring.dao; 

import org.andrea.myexample.HibernateOnSpring.entity.Person; 
import org.hibernate.SessionFactory; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 

@Repository 
@Transactional 
public class PersonDAOImpl2 { 

    // Factory per la creazione delle sessioni di Hibernate: 
     private static SessionFactory sessionFactory; 

     // Metodo Setter per l'iniezione della dipendenza della SessionFactory: 
     public void setSessionFactory(SessionFactory sessionFactory) { 
      this.sessionFactory = sessionFactory; 
      System.out.println("Ho iniettato la SessionFactory: " + sessionFactory); 

     } 

     /** CREATE CRUD Operation: 
     * Aggiunge un nuovo record rappresentato nella tabella rappresentato 
     * da un oggetto Person 
     */ 
     @Transactional(readOnly = false) 
     public Integer addPerson(Person p) { 

      System.out.println("Inside addPerson()"); 
      System.out.println("Connessione aperta: " + sessionFactory.getCurrentSession().isOpen()); 
      System.out.println("E' connesa:" + sessionFactory.getCurrentSession().isConnected()); 

      Integer personID = personID = (Integer) sessionFactory.getCurrentSession().save(p); 

      return personID; 

     } 

} 

을 그리고 나는 그것이 어떻게 작동하는지 테스트하는 main() 메소드를 conteining MainApp 클래스를 만들 수있다 :이 인터페이스를 구현하는 구체적인 클래스 PersonDAOImpl이 하나를 만들 수 있습니다.

문제는 그 내가 스택 트레이스에 다음과 같은 오류 메시지가 얻을 데이터베이스에 새 레코드 삽입 할 때 나는 MainApp을 실행할 때 :

INFO: Using DataSource [[email protected]] of Hibernate SessionFactory for HibernateTransactionManager 
Ho iniettato la SessionFactory: [email protected] 
Contesto recuperato: org[email protected]70501e4e: startup date [Sat Mar 09 10:02:37 CET 2013]; root of context hierarchy 
Creato persona1: [email protected] 
Exception in thread "main" java.lang.ClassCastException: org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl2$$EnhancerByCGLIB$$d0c4a932 cannot be cast to org.andrea.myexample.HibernateOnSpring.dao.PersonDAO 
    at org.andrea.myexample.HibernateOnSpring.MainApp.main(MainApp.java:26) 

보인다는 세션을 찾을 수없는 것을 개체 및 지금 나는 의심의 여지가 : 나는 그 봄 열고 자동으로 모든 @ Transactional 메서드에 대한 세션을 알고 있지만 작동하지 않는 것 같습니다!

@Transactional(readOnly = false) 
    public Integer addPerson(Person p) { 

     System.out.println("Inside addPerson()"); 

     Session session = sessionFactory.openSession(); 

     Transaction tx = null; 
     Integer personID = null; 

     try { 
      tx = session.beginTransaction(); 

      personID = (Integer) session.save(p); 
      tx.commit(); 
     } catch (HibernateException e) { 
      if (tx != null) 
       tx.rollback(); 
      e.printStackTrace(); 
     } finally { 
      session.close(); 
     } 

     return personID; 

    } 

그러나 나는 봄이 자동으로를 엽니 다 말할 수 있다고 생각 : 나는 메서드를 호출 할 때 명시 적으로 새 세션을 열면

반대로

, 그것은 이런 식으로 ... 잘 작동 세션 때 방법에 입력하고 종료이 내 XML 설정 파일입니다

때를 닫습니다

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx-3.1.xsd "> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/SpringTestDb" /> 
     <property name="username" value="root" /> 
     <property name="password" value="MY_DB_PSWD" /> 
     <property name="initialSize" value="2" /> 
     <property name="maxActive" value="5" /> 
    </bean> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="org.andrea.myexample.HibernateOnSpring.entity" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.show_sql">false</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <bean id="personDAOImpl" class="org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl2" > 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <!-- Register @Autowired annotation --> 
    <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> 
</beans> 

누군가가 나를 도울 수 있습니까?

TNX

안드레아

+0

'PersonDAOImpl2'사용 방법 –

답변

2

당신은 당신의 DAO에 대한 중 하나를 사용하는 인터페이스를 필요로하거나 클래스를 사용하는 proxy mechanism을 다시 구성합니다.

1

당신은 세션을 "열기"때 봄에 이야기해야합니다. 요청을 처리하기 전에 세션을 여는 Spring 구현을 사용할 준비가되었습니다.

<mvc:interceptors> 
    <bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> 
     <property name="sessionFactory"> 
      <ref local="sessionFactory"/> 
     </property> 
    </bean> 
</mvc:interceptors>