我是jsf 2.0 spring 3.1和hibernate 4.1集成的新手。如何更改以下代码,因为hibernate 4.0不包含HibernateDaoSupport。
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class CustomerDaoImpl extends
HibernateDaoSupport implements CustomerDao{
public void addCustomer(Customer customer){
customer.setCreatedDate(new Date());
getHibernateTemplate().save(customer);
}
public List<Customer> findAllCustomer(){
return getHibernateTemplate().find("from Customer");
}
}
我正在尝试这个示例:http://www.mkyong.com/jsf2/jsf-2-0-spring-hibernate-integration-example/
答案 0 :(得分:12)
我找到了解决方案。我应该使用会话工厂。
import java.util.List;
import org.hibernate.SessionFactory;
public class CustomerDaoImpl implements CustomerDao{
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void addCustomer(Customer customer){
getSessionFactory().getCurrentSession().save(customer);
}
public List<Customer> findAllCustomer(){
List list = getSessionFactory().getCurrentSession().createQuery("from Customer").list();
return list;
}
}
答案 1 :(得分:3)
通过注释获得hibernate会话的另一种方法,如下面的
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
public Session getSession() {
return sessionFactory.getCurrentSession();
}
Spring applicationContext.xml中的SessionFactory bean
<!-- sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="packagesToScan">
<list>
<value></value>
</list>
</property>
<property name="hibernateProperties">
<props></props>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
答案 2 :(得分:1)
正如萨米拉上面所说的那样,取代了#34; SessionFactory&#34; for&#34; HibernateDaoSupport&#34;是正确的方法&#34;对于任何新的Spring / Hibernate代码:
注意:Hibernate访问代码也可以在普通的Hibernate中编码 样式。因此,对于新开工项目,请考虑采用 标准的Hibernate风格的编码数据访问对象取而代之 在SessionFactory.getCurrentSession()上。这个HibernateTemplate 主要作为基于Hibernate 3的数据的迁移帮助程序存在 访问代码,从Hibernate 4.x中的错误修复中受益。
但是......我也在一个Mkyong.com教程中遇到了同样的问题:
http://www.mkyong.com/spring/maven-spring-hibernate-mysql-example/
我使用的是Spring 4.2.4.RELEASE和Hibernate 4.3.8.Final。
对我来说(使教程启动/运行)的权宜之计是使用Spring-orm对HibernateDaoSupport的内置支持。具体来说,我只是改变了来自&#34; hibernate3&#34;的导入。到&#34; hibernate4&#34;:
StockDaoImpl.java =&gt;
package com.mkyong.stock.dao.impl;
...
// import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
...
如果有人遇到同样的问题:)
答案 3 :(得分:-2)
您可以通过扩展HibernateDAOSupport类并覆盖其afterPropertiesSet()方法来使用Hibernate DAO Support。
在HibernateDAO支持中调用此方法,此时由于sessionFactory为null,因此抛出此错误。在您的自定义类中,您可以显式设置此属性,然后调用父类的相同方法(即HibernateDAOSupport的addProperties()方法)
package com.techcielo.spring4.hibernate.template;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
@Component("hibernateTemplate")
public class Hibernate4CustomTemplate extends HibernateTemplate{
@Autowired(required=true)
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
System.out.println("Setting SessionFactory");
this.sessionFactory = sessionFactory;
super.setSessionFactory(sessionFactory);
}
@Override
public void afterPropertiesSet() {
System.out.println("Checking if properties set..."+this.sessionFactory);
setSessionFactory(sessionFactory);
super.afterPropertiesSet();
}
}
以下内容可用于sample!