我不确定使用Spring3将Hibernate的会话实例注入DAO类的最佳方法。我没有使用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 Template。 所以任何其他改进建议都会有所帮助。
答案 0 :(得分:22)
skaffman的帖子和Sean的组合以及注释的使用。
道
@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>
答案 1 :(得分:20)
Spring Reference suggests this usage:
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 :(得分:19)
你过度复杂了。
请不要使用那种在Hibernate文档中不断出现的糟糕HibernateUtil
模式。 Spring提供了一种更好,更好的方法来配置Hibernate SessionFactory
- LocalSessionFactoryBean
(see docs for example usage)。
LocalSessionFactoryBean
生成一个SessionFactory
对象,您可以将其作为属性注入DAO bean。
Spring很高兴您不使用HibernateDaoSupport
和HibernateTemplate
- 有section of the docs解释如何很好地完成这项工作。
答案 3 :(得分:12)
使用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