Java 在Spring3之前注入Hibernate会话的最佳方法
我不确定使用Spring3将Hibernate的会话实例注入DAO类的最佳方法是什么。我没有为此使用Spring的Hibernate模板支持,因此下面是我在DAO类中的代码Java 在Spring3之前注入Hibernate会话的最佳方法,java,hibernate,spring,Java,Hibernate,Spring,我不确定使用Spring3将Hibernate的会话实例注入DAO类的最佳方法是什么。我没有为此使用Spring的Hibernate模板支持,因此下面是我在DAO类中的代码 public void setSessionFactory(SessionFactory sessionFactory){ this.sessionFactory=sessionFactory; } public SessionFactory getSessionFactory(){ log.info("
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就没有任何依赖关系,您只需使用普通的Hibernate即可。您把它复杂化了
请不要使用Hibernate文档中不断出现的糟糕的HibernateUtil
模式。Spring提供了一种非常非常好的方式来配置HibernateSessionFactory
——LocalSessionFactoryBean
()
LocalSessionFactoryBean
生成一个SessionFactory
对象,您可以将其作为属性注入到DAOBean中
Spring很高兴您不使用
HibernateDaoSupport
和HibernateTemplate
——这里有一个解释,说明如何很好地做到这一点。结合了skaffman的帖子和Sean的帖子,再加上注释的使用
刀
xml
product.hbm.xml
hibernate.dialogue=org.hibernate.dialogue.hsql方言
使用Hibernate的可取方法是通过JPA(Hibernate 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
如何配置SessionFactory
本身?通过使用Hibernate标准方式,HibernateUtil类从类路径读取各种属性和cfg文件这就是我正在做的我有一个通用DAO类,其中有所有通用的持久性方法,我是在DAO类中注入Hibernate会话工厂,而不是使用Spring Hibernate SessionFactory Util类,我使用的是我自己的实现。因此,我似乎走上了正确的道路。我不喜欢注入SessionFactory,因为它是模拟会话并在单元测试中对其进行断言的PITA。注入会话而不是SessionFactory难道不可能吗?@BastianVoigt这是另一个问题。请随便问。但简单的回答是:只有当存储库类的作用域不是singleton,或者会话是作为作用域代理的bean时,这才可能实现。这两种说法听起来都很恶心me@BastianVoigt虽然我支持这一点,但我认为JPA在这方面并没有真正帮助你。你应该有完全一样的problem@SeanPatrickFloyd不完全正确。使用JPA,您可以注入EntityManager,它类似于会话。无需在代码中直接使用EntityManagerFactory。感谢文档指针,我必须说,将使用Spring的LocalSessionFactoryBean处理会话工厂创建,然后使用我的通用DAO模式使用LocalSessionFactoryBean创建的SessionFactory。请发布一个等效的java配置
@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();
}
}
<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>
@PersistenceContext
private EntityManager entityManager;
<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>