Подтвердить что ты не робот

Лучший способ вставить сеанс Hibernate с помощью Spring 3

Я не уверен, что лучший способ ввести экземпляр сеанса Hibernate в классы DAO с помощью Spring3. Я не использую поддержку шаблона 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/>

Я не уверен, что это лучший способ сделать инъекцию SessionFactory, поскольку мы не хотим использовать шаблон Spring для нашего проекта. Поэтому любое другое предложение для улучшения будет очень полезно.

4b9b3361

Ответ 1

Spring Ссылка предлагает это использование:

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

Комбинация сообщения скаффмана и Шона плюс использование аннотаций.

ДАО

@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

Вы слишком усложняете это.

Не используйте этот ужасный шаблон HibernateUtil, который появляется в документации Hibernate. Spring обеспечивает гораздо более удобный способ настройки Hibernate SessionFactory - LocalSessionFactoryBean (см. документы, например, использование).

LocalSessionFactoryBean создает объект SessionFactory, который вы можете вводить как свойство в свой DAO beans.

Spring рад за то, что вы не использовали HibernateDaoSupport и HibernateTemplate - там раздел документации, объясняющий, как это сделать это приятно.

Ответ 4

Рекомендуемым способом использования 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