gpt4 book ai didi

java - OpenSessionInView 模式

转载 作者:行者123 更新时间:2023-11-30 06:56:38 25 4
gpt4 key购买 nike

我有一个使用 Spring 3.0.1、Struts 2.0、Hibernate 3.3.2 和 Apache Tiles 的 Web 应用程序,我想引入 OpenSessionInView 模式。我已经在 web.xml 文件中添加了过滤器,但我不知道下一步该怎么做。

Web.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<display-name>
Struts2Hibernate3Spring3Tile2Integration
</display-name>
<welcome-file-list>
<welcome-file>articles.jsp</welcome-file>
</welcome-file-list>

<context-param>
<param-name>
org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG
</param-name>
<param-value>/WEB-INF/tiles-def.xml</param-value>
</context-param>

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.apache.struts2.tiles.StrutsTilesListener
</listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- Filtre pour OpenSessionInView -->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

ApplicationContext.xml 文件

<?xml version="1.0" encoding="UTF-8"?>

<!-- On demande à Spring de gérer l’ensemble des classes package ma.ecommerce -->
<context:component-scan base-package="ma.ecommerce" />
<!-- Pour accéder aux paramètres définis dans le fichier database.properties -->
<context:property-placeholder location="classpath:database.properties" />
<tx:annotation-driven transaction-manager="hibernateTransactionManager" />

<!-- La définition du bean sessionFactory en utilisant Spring ORM et Hibernate -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="annotatedClasses">
<list>
<value>ma.ecommerce.service.modele.Article</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
</props>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${database.driver}"></property>
<property name="url" value="${database.url}"></property>
<property name="username" value="${database.user}"></property>
<property name="password" value="${database.password}"></property>
</bean>


<bean id="hibernateTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="article" class="ma.ecommerce.presentation.action.ArticleAction" />
<bean id="articleBean" class="ma.ecommerce.domaine.ArticleBean" />
<bean id="articleDao" class="ma.ecommerce.dao.DaoImpl"/>

DaoImpl.java 文件

@Repository("articleDao")
public class DaoImpl implements IDao
{
@Autowired
private SessionFactory sessionFactory;


public SessionFactory getSessionFactory() {
return sessionFactory;
}

public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

@Override
public void saveArticle(Article article)
{
sessionFactory.getCurrentSession().saveOrUpdate(article);
}

@SuppressWarnings("unchecked")
@Override
public List<Article> getArticleList()
{
return (List<Article>)sessionFactory.getCurrentSession().createCriteria(Article.class).list();
}

最佳答案

似乎唯一缺少的是在渲染 View 后提交并关闭 session 。也许你可以用过滤器来做到这一点:

https://developer.jboss.org/wiki/OpenSessionInView

但是,如果您确实想使用“在 View 中打开 session ”(反)模式,则应该三思而后行。乍一看,这听起来像是一个避免 LazyLoadingExceptions 的简单解决方案,但您应该意识到它带来的惩罚:

  • 在原子事务范围之外工作,因此无法应用隔离级别配置
  • 渲染过程中的每个额外请求都将以自动提交模式执行,因此数据库必须做更多工作
  • session 的开放时间可能超过所需时间

也许您可以找出真正需要哪些字段,并在服务层内准备一个投影/DTO,并将其传播到 View 。这将释放数据库并封装数据的更改。

问题来了,你真的需要访问 View 中的数据库吗?

关于java - OpenSessionInView 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41662183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com