Modo OpensessionInView do Hibernate

1. Usando o hibernate para implementar o DAO em javaweb, há um problema que os dados de partes relacionadas são carregados na camada de visualização.

Solução:

  • Altere o método de carregamento da parte relacionada para lazy = false, carregue instantaneamente
  • Use o modo OpenSessionInView para reabrir a sessão na camada de visualização para acessar o banco de dados.

Em segundo lugar, o princípio de realização do modo OpenSessionInView:
primeiro, use getCurrentSession para abrir a sessão
. A diferença entre os métodos openSession e getCurrentSession:

  1. openSession pode ser visto literalmente, é para abrir um novo objeto de sessão, e cada uso é para abrir uma nova sessão, se você usar várias vezes, a sessão obtida não é o mesmo objeto, e você precisa chamar close após usar Método para fechar a sessão.

  2. GetCurrentSession, literalmente, é obter um objeto de sessão no contexto atual. Quando este método é usado pela primeira vez, um objeto de sessão é gerado automaticamente, e quando é usado várias vezes consecutivas, a sessão obtida é o mesmo objeto .Esta é uma das diferenças do openSession. Simplificando, getCurrentSession é: se já existe, use o antigo, se não, crie um novo. Não há necessidade de fechar a sessão manualmente. Depois que a transação for confirmada, ela será fechada automaticamente.要求增删改查都要有事务环境

Etapas de implementação:
1. Implementar OpenSessonInViewFilter

public class OpenSessionInViewFilter implements Filter {
    
    

	@Override
	public void init(FilterConfig arg0) throws ServletException {
    
    
		// TODO Auto-generated method stub

	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
    
    
		Transaction tx = null;
		try {
    
    
			Session session = HibernateSessionUtils.getSessionFactory().getCurrentSession();
			tx = session.beginTransaction();
			//往下访问资源: 访问下一个过滤器,或者到目标资源
			chain.doFilter(request, response);
			
			tx.commit();
		} catch (HibernateException e) {
    
    
			tx.rollback();
			e.printStackTrace();
		}
	}

	@Override
	public void destroy() {
    
    
		// TODO Auto-generated method stub
	}
}

2. Configuração do filtro

  <filter>
  	<filter-name>opensession</filter-name>
  	<filter-class>com.gec.hiber.utils.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>opensession</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

3.Hibernate.cfg.xml especifica o contexto da sessão

<property name="current_session_context_class">thread</property>

4. Otimize a implementação do DAO, a forma de obter a Sessão deve ser a mesma do filtro. Adições, exclusões, modificações e investigações devem ter um ambiente de negócios.

public Session getSession() {
    
    
		return HibernateSessionUtils.getSessionFactory().getCurrentSession();	
	}

	@Override
	public List<Emp> findAll() {
    
    
		List<Emp> list = this.getSession().createCriteria(Emp.class).list();		
		return list;
	}

3. Caso abrangente

  1. Tecnologia: hibernate + servlet / jsp
  2. base de dados:
    Insira a descrição da imagem aqui
  3. Use a engenharia reversa para gerar um relacionamento um para muitos bidirecional.
  4. Use o modo OpenSessionInView
  5. Implementar DAO

O
principal método de FilmInfoDao :
adicionar informações do filme addFilm ();
consulta combinada das informações do filme searchFilmByCondition (); requer consulta QBC

O
método principal de FilmTypeDao :
Consultar todas as categorias de filmes: findAllFilmType ();

  1. Implementação de Servlet
    FilmSearchServlet
    Insira a descrição da imagem aqui
    Insira a descrição da imagem aqui
    FilmAddServlet
    Insira a descrição da imagem aqui

  2. JSP

Acho que você gosta

Origin blog.csdn.net/weixin_45879810/article/details/108377908
Recomendado
Clasificación