Лучший способ вставить сеанс 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 для нашего проекта.
Поэтому любое другое предложение для улучшения будет очень полезно.
Ответы
Ответ 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