2017-01-15 5 views
1

У меня есть веб-приложение, которое использует Spring 3.0.1, Struts 2.0, Hibernate 3.3.2 и Apache Tiles, и я хочу представить шаблон OpenSessionInView. Я уже добавил фильтр в свой файл web.xml, но я не знаю, что делать дальше.Шаблон OpenSessionInView

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(); 
} 

ответ

1

Кажется, единственное, чего не хватает, это совершить и закрыть сеанс после визуализации вашего представления. Может быть, вы можете сделать это с помощью фильтра:

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

Но вы должны дважды подумать, если вы действительно хотите работать с «открытой сессии в View» (анти) шаблон. Сначала это звучит как простое решение, чтобы избежать LazyLoadingExceptions, но вы должны быть осведомлены о казни он привезет с собой:

  • , работающим за пределами атомного объема транзакций, поэтому никакой конфигурация уровня изоляции не может быть применен
  • каждого дополнительный запрос в процессе рендеринга будет выполняться в режиме автоматической фиксации, так что база данных должна сделать больше работы
  • сессию которые, возможно, остаются открытыми дольше, чем это необходимо

может быть, вы можете выяснить, какие поля действительно необходимыd подготовьте проекцию/DTO внутри вашего уровня обслуживания, который вместо этого распространяется на представление. Это приведет к разрядке базы данных и инкапсулированию изменений данных.

Вопрос здесь, вам действительно нужен доступ к базе данных внутри вашего представления?

+0

спасибо, да, у меня есть часть в моем приложении, где клиент может добавлять, редактировать, удалять или перечислить свои статьи, и мне нужно получить доступ к базе данных, и, кстати, это своего рода домашнее задание, и меня спросили использовать OpenSessionInView ... –

Смежные вопросы