Open Session View + Spring

17 views
Skip to first unread message

valdi.ads

unread,
Feb 4, 2014, 9:40:04 AM2/4/14
to ce...@googlegroups.com
Alguém pode me auxiliar como configurar o partnner OpenSessionView na minha aplicação JSF que utilizo Spring?

Rafael Ponte

unread,
Feb 4, 2014, 9:42:46 AM2/4/14
to ce...@googlegroups.com
Oi valdi,

Que dificuldades você está tendo?

Basicamente você precisa que o controle transacional da sua aplicação seja gerenciada pelo Spring (com o @Transactional, por exemplo) e ter este filtro configurado no seu web.xml: https://github.com/rponte/jsf-issuetracker-project/blob/master/WebContent/WEB-INF/web.xml#L35-L54


2014-02-04 valdi.ads <vald...@gmail.com>:
Alguém pode me auxiliar como configurar o partnner OpenSessionView na minha aplicação JSF que utilizo Spring?

--
Você está recebendo esta mensagem porque se inscreveu no grupo "CEJUG" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para cejug+un...@googlegroups.com.
Para postar neste grupo, envie um e-mail para ce...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/cejug.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--

valdi junoir

unread,
Feb 4, 2014, 10:05:09 AM2/4/14
to ce...@googlegroups.com
Olá Rafael, fiz as configurações que me mandou mais ainda estou tendo o problema com o org.hibernate.LazyInitializationException.
Não consigo acessar a lista. do objeto.

--
Atenciosamente,
Valdi Geraldo Teixeira Junior.
Graduado em Análise e Desenvolvimento de Sistemas;
Pós-Graduando MBA Gerenciamento de Projetos.
Analista Desenvolvedor de Sistemas Faculdade Leão Sampaio
Gerente de Projetos CenterSoftware

Paulo Jr.

unread,
Feb 4, 2014, 10:18:04 AM2/4/14
to ce...@googlegroups.com
Valdi, manda o código que está tentando fazer.

Abraço,


2014-02-04 valdi junoir <vald...@gmail.com>:



--
Paulo Alves Junior

Instrutor - Caelum | Ensino e Inovação

JugLeader CEJUG

Hurraa - OpenSource project to resource management

valdi.ads

unread,
Feb 4, 2014, 10:52:12 AM2/4/14
to ce...@googlegroups.com
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "contareceber")
private List<ParcelaContaReceber> parcelasContaReceber;

_____________________
<filter>
<description>
Necessário para o Lazy Loading funcionar quando as entidades
gerenciadas pelo EntityManager forem utilizadas em
ManagedBeans ou em JSPs.

Um bean com o id 'entityManagerFactory' precisa existir no
applicationContext.xml. Se precisar pode ser informado um
parâmetro no filtro para indicar qual o id do bean é o
EntityManagerFactory. (Ver documentação do Spring)
</description>
<filter-name>oemiv</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>oemiv</filter-name>
<url-pattern>/Locus/restrito/financeiro.xhtml</url-pattern>
</filter-mapping>

Rafael Ponte

unread,
Feb 4, 2014, 11:45:34 AM2/4/14
to ce...@googlegroups.com
Oi valdi,

Em que momento exatamente acontece o a LazyInitializationException (LIE)? Pois o Open Session In View só evita o LIE dentro do mesmo request.




2014-02-04 valdi junoir <vald...@gmail.com>:

valdi junoir

unread,
Feb 4, 2014, 11:47:02 AM2/4/14
to ce...@googlegroups.com
Quando tento acessar private List<ParcelaContaReceber> parcelasContaReceber;

Rafael Ponte

unread,
Feb 4, 2014, 11:49:12 AM2/4/14
to ce...@googlegroups.com
valdi,

Em que momento a entidade, que possui o atributo lazy parcelasContasReceber, foi usada? Em que escopo ela se encontra?


2014-02-04 valdi junoir <vald...@gmail.com>:

Paulo Jr.

unread,
Feb 4, 2014, 12:19:53 PM2/4/14
to ce...@googlegroups.com
Valdi,

Porque você está colocando o openEntityManager apenas para financeiro.xhtml?

         <filter>

<filter-name>oemiv</filter-name>
<filter-class>
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>oemiv</filter-name>
<url-pattern>/Locus/restrito/financeiro.xhtml</url-pattern>
</filter-mapping>

Você deve habilita-lo para todo o sistema <url-patter>/</url-patter>

Alguma requisição pode estar acontecendo no controller que pode gerar lazyInitializationException.






2014-02-04 Rafael Ponte <rpo...@gmail.com>:



--

Paulo Jr.

unread,
Feb 4, 2014, 12:20:35 PM2/4/14
to ce...@googlegroups.com
Sem falar que o mapento é de URL <url-pattern /> e não de arquivos do servidor.


2014-02-04 Paulo Jr. <paulo...@gmail.com>:

valdi junoir

unread,
Feb 4, 2014, 12:23:20 PM2/4/14
to ce...@googlegroups.com
hum, eu nunca configurei o esse padrão, por isso a falta de conhecimento. Li que preciso mapear a url por isso mapiei .

Rafael Ponte

unread,
Feb 4, 2014, 12:24:13 PM2/4/14
to ce...@googlegroups.com
Paulo,

Nem havia percebido que ele havia alterado a configuração no web.xml. E sobre o url, normalmente com JSF2 usamos a extensão .xhtml mesmo, logo a url tem o mesmo path dos arquivos no servidor.

Paulo Jr.

unread,
Feb 4, 2014, 12:37:11 PM2/4/14
to ce...@googlegroups.com
Mesmo assim o ideal é mapear o sistema na raiz :), mas legal, não havia prestado atenção que agora o pessoal mapeia para xhtml direto.

Valdi, sem problema, estamos aqui para aprender.

Abraço,


2014-02-04 Rafael Ponte <rpo...@gmail.com>:

valdi junoir

unread,
Feb 4, 2014, 12:57:06 PM2/4/14
to ce...@googlegroups.com
Enfim ainda estou com meu erro..rsrs
Tenho o Objeto ContaReceber  que tem uma lista de Parcelas.
pego a lista de COntaReceber e coloco em um DataTable, criei um modal pra visualizar as parcelas do de cada Conta Receber quando tento acessar da esse erro. Pesquisando soluções encontrei esse padrão. configurei como me informou mais ainda continua o erro.

Paulo Jr.

unread,
Feb 4, 2014, 1:10:59 PM2/4/14
to ce...@googlegroups.com
Valdi, como você está obtendo o EntityManager? Como você consegue ele?


2014-02-04 valdi junoir <vald...@gmail.com>:

valdi junoir

unread,
Feb 4, 2014, 1:12:00 PM2/4/14
to ce...@googlegroups.com
@PersistenceContext
private EntityManager entityManager;

Paulo Jr.

unread,
Feb 4, 2014, 1:24:43 PM2/4/14
to ce...@googlegroups.com
Blz.. e como ta a configuração de transação?


2014-02-04 valdi junoir <vald...@gmail.com>:

valdi junoir

unread,
Feb 4, 2014, 1:25:58 PM2/4/14
to ce...@googlegroups.com
@Service
@Transactional(propagation = Propagation.REQUIRED)
isso pra classe inteira

o método
@Override
public List<ContaReceber> listar() {
// TODO Auto-generated method stub
List<ContaReceber> contas = new ArrayList<ContaReceber>();
Session session = (Session) entityManager.getDelegate();
Criteria criteria = session.createCriteria(ContaReceber.class);
contas = criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.list();
return contas;
}

Rafael Ponte

unread,
Feb 4, 2014, 1:34:58 PM2/4/14
to ce...@googlegroups.com
valdi,

O modal com as parcelas só é aberto após clicar em um item da datatable? E isso dispara um evento ajax para exibir as informações no modal?


2014-02-04 valdi junoir <vald...@gmail.com>:

valdi junoir

unread,
Feb 4, 2014, 1:39:21 PM2/4/14
to ce...@googlegroups.com
sim.

Rafael Ponte

unread,
Feb 4, 2014, 1:46:16 PM2/4/14
to ce...@googlegroups.com
valdi,

É como eu te disse antes, o OSIV só mantém o contexto de persistência da JPA aberto durante o mesmo request. Como se trata de duas requisições, a primeira você exibe a tabela e a segunda você exibe o modal, o contexto de persistência já é outro no segundo request, daí ao tentar obter o relacionamento LAZY ocorre o LIE.

Nesse caso você terá que recarregar o relacionamento ou a entidade sempre que necessário (não há qualquer problema em faz isso). Você pode fazer algo do tipo,





2014-02-04 valdi junoir <vald...@gmail.com>:

Paulo Jr.

unread,
Feb 4, 2014, 1:50:48 PM2/4/14
to ce...@googlegroups.com
Ou então, usando seu Criteria que já está na tela, adicionar a propriedade:

criteria.setFetchMode("parcelas", FetchMode.JOIN);

Desse modo já vai carregar as parcelas junto, porém cuidado pois se algum dos seus ContaReceber não tem parcela, ai já vai furar a ideia.


valdi junoir

unread,
Feb 4, 2014, 2:03:04 PM2/4/14
to ce...@googlegroups.com
Obrigado a todos, consegui resolver.

Paulo Jr.

unread,
Feb 4, 2014, 2:21:59 PM2/4/14
to ce...@googlegroups.com
Então Valdi, o bom de comunidade é pedir ajuda e depois compartilhar como foi resolvido o problema :D .. assim outros que passarem por isso poderão seguir sua solução para o problema deles.

Então, como você resolveu no fim das contas?


2014-02-04 valdi junoir <vald...@gmail.com>:

valdi junoir

unread,
Feb 4, 2014, 2:25:43 PM2/4/14
to ce...@googlegroups.com
Sim...Solução: criteria.setFetchMode("parcelasContaReceber", FetchMode.JOIN);

valdi junoir

unread,
Feb 4, 2014, 2:25:55 PM2/4/14
to ce...@googlegroups.com
public List<ContaReceber> listar() {
// TODO Auto-generated method stub
List<ContaReceber> contas = new ArrayList<ContaReceber>();
Session session = (Session) entityManager.getDelegate();
Criteria criteria = session.createCriteria(ContaReceber.class);
criteria.setFetchMode("parcelasContaReceber", FetchMode.JOIN);
contas = criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.list();
return contas;
}

Paulo Jr.

unread,
Feb 4, 2014, 2:26:43 PM2/4/14
to ce...@googlegroups.com
Massa... é isso ai.


2014-02-04 valdi junoir <vald...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages