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:
-
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.
-
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
- Tecnologia: hibernate + servlet / jsp
- base de dados:
- Use a engenharia reversa para gerar um relacionamento um para muitos bidirecional.
- Use o modo OpenSessionInView
- 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 ();
-
Implementação de Servlet
FilmSearchServlet
FilmAddServlet
-
JSP