복붙노트

[SPRING] Spring 3에서 최대 절전 모드 세션을 삽입하는 가장 좋은 방법

SPRING

Spring 3에서 최대 절전 모드 세션을 삽입하는 가장 좋은 방법

Spring3을 사용하여 DAO 클래스에 Hibernate의 세션 인스턴스를 삽입하는 가장 좋은 방법이 무엇인지 모르겠습니다. 나는 Spring의 Hibernate Template 지원을 사용하지 않고있다. 그래서 여기에 DAO 클래스에있는 코드가있다.

public void setSessionFactory(SessionFactory sessionFactory){
    this.sessionFactory=sessionFactory;
}


public SessionFactory getSessionFactory(){
    log.info("Returning a refrence to the session instance");
    if(sessionFactory==null){
         log.error("Not able to find any associated session");
         throw new RuntimeException("Not able to find any associated session");
    }
    return sessionFactory;
}

이 메소드에 세션을 주입하기위한 코드는 다음과 같습니다.

<bean id="genericSessionFactory" class="HibernateSessionFactory"
        factory-method="getSessionfactory" scope="prototype/>

이 프로젝트가 Spring Template를 사용하고 싶지 않기 때문에 이것이 SessionFactory injection을하는 가장 좋은 방법인지 확신 할 수 없습니다. 따라서 개선을위한 다른 제안이 도움이 될 것입니다.

해결법

  1. ==============================

    1.Spring Reference에서는 다음과 같은 사용법을 제안합니다.

    Spring Reference에서는 다음과 같은 사용법을 제안합니다.

    public class ProductDaoImpl implements ProductDao {
    
        private SessionFactory sessionFactory;
    
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    
        public Collection loadProductsByCategory(String category) {
            return this.sessionFactory.getCurrentSession()
                    .createQuery(
                        "from test.Product product where product.category=?")
                    .setParameter(0, category)
                    .list();
        }
    }
    

    그런 식으로 클래스는 Spring에 대한 의존성을 가지지 않는다. 단지 평이한 Hibernate를 사용한다.

  2. ==============================

    2.Skaffman의 게시물과 Sean의 조합과 특수 효과의 사용.

    Skaffman의 게시물과 Sean의 조합과 특수 효과의 사용.

    DAO

    @Respository("productDao")
    public class ProductDaoImpl implements ProductDao {
    
        @Autowired
            private SessionFactory sessionFactory;
    
                public Collection loadProductsByCategory(String category) {
                        return this.sessionFactory.getCurrentSession()
                            .createQuery(
                                "from test.Product product where product.category=?")
                            .setParameter(0, category)
                            .list();
            }
    }
    

    XML

    <beans>
    
      <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
      </bean>
    
      <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="mappingResources">
          <list>
            <value>product.hbm.xml</value>
          </list>
        </property>
        <property name="hibernateProperties">
          <value>
            hibernate.dialect=org.hibernate.dialect.HSQLDialect
          </value>
        </property>
      </bean>
    
    </beans>
    
  3. ==============================

    3.너는 이걸 지나치게 복잡하게 만든다.

    너는 이걸 지나치게 복잡하게 만든다.

    Hibernate 문서에서 계속 나타나는 엄청난 HibernateUtil 패턴을 사용하지 마라. Spring은 Hibernate SessionFactory를 구성하는 훨씬 더 좋은 방법 인 LocalSessionFactoryBean을 제공한다 (예제 사용법은 docs를 보라).

    LocalSessionFactoryBean은 DAO 빈에 프로퍼티로 삽입 할 수있는 SessionFactory 객체를 생성합니다.

    Spring은 당신이 HibernateDaoSupport와 HibernateTemplate을 사용하지 않는 것을 기쁘게 생각한다 - 문서를 멋지게 다루는 방법을 설명하는 문서 섹션이있다.

  4. ==============================

    4.Hibernate를 사용하는 가장 좋은 방법은 JPA (hibernate-entitymanager)를 이용하는 것이다.

    Hibernate를 사용하는 가장 좋은 방법은 JPA (hibernate-entitymanager)를 이용하는 것이다.

    @PersistenceContext
    private EntityManager entityManager;
    

    applicationContext.xml에 있습니다.

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="yourUnitName" />
        <property name="dataSource" ref="dataSource" /> <!-- needs a data source bean -->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="databasePlatform" value="${hibernate.dialect}" />
            </bean>
        </property>
    </bean>
    
    
    
    <bean id="transactionManager" 
      class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    

    그리고 META-INF / persistence.xml이 필요합니다.

  5. from https://stackoverflow.com/questions/4699381/best-way-to-inject-hibernate-session-by-spring-3 by cc-by-sa and MIT license