0

我在我的项目中使用 struts2-spring-hibernate。我正在通过 spring 处理数据库连接,所以我不需要 hibernate.cfg.xml 我需要执行我的查询并且我需要结果

通过使用这些方法,我成功获得了结果

手动打开和关闭会话: 1. Session session = sessionFactory.openSession(); 2.会话newSession = HibernateUtil.getSessionFactory().openSession();

不手动处理会话 1. getHibernateTemplate().find(); 2.getSession().createSQLQuery();

我不知道哪种方法最好,请建议我,哪种方法最适合会话

当会话将通过 getHibernateTemplate() 和 getSession() 打开和关闭时。

4

1 回答 1

0

我将展示我一起使用这些框架的方式。我避免了 HibernateTemplate 的需要,我认为这个类太有限了,我更喜欢直接使用 Session。

一旦你的项目中有 Spring,它应该在你的 Daos 中注入 Hibernate SessionFactory,这样你就可以处理 Session。首先,您需要在 applicationContext.xml 中配置 SessionFactory:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
</bean>

现在您可以使用@Autowired 注解注入 SessionFactory:

@Repository
public class HibernateProductDao implements ProductDao {

    private final SessionFactory factory;

    @Autowired
    public HibernateProductDao(final SessionFactory factory) {
        this.factory = factory;
    }

    public List<Product> findAll() {
        return factory.getCurrentSession().createCriteria(Product.class).list();
    }

    public void add(final Product product) {
        factory.getCurrentSession().save(product);
    }
}

这里有一些重要的事情,你应该使用 getCurrentSession() 方法,因为这样你可以让 Spring 控制 Session 生命周期。如果您使用 getSession() 代替,它将成为您的责任,例如,关闭会话。

现在,让我们配置 Struts 2。在您的 web.xml 中:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

您还需要文件 struts.xml,说明 Spring 将制造对象:

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.objectFactory" value="spring" />
</struts>

最后,您可以在您的操作中注入道:

public class ProductAction {

    private ProductDao dao;

    @Autowired
    public ProductAction(ProductDao dao) {
        this.dao = dao;
    }
}

当然,由于您使用的是 Spring 注解,因此您需要使用component-scan 扫描包。

这是我发现集成此框架的最佳方式,希望对您有所帮助。

于 2013-01-03T20:49:48.297 回答