lelodois 26 de mai. de 2011
Pelo que eu saiba o vraptor não implementa.
http://blog.caelum.com.br/enfrentando-a-lazyinitializationexception-no-hibernate/
No seu web.xml
<filter>
<filter-name> hibernateSessionFilter</filter-name>
<filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
Abraços
Lucas_Cavalcanti 26 de mai. de 2011
se vc usa o componente do hibernate ou jpa ele suporta isso sim: http://vraptor.caelum.com.br/documentacao/componentes-utilitarios-opcionais/
configure só pelo context-param packages, não pelo provider
PaduaAlves 26 de mai. de 2011
meu web.xml está assim
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<filter>
<filter-name>vraptor</filter-name>
<filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
</filter>
<filter-mapping>
<filter-name>vraptor</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<context-param>
<param-name>br.com.caelum.vraptor.provider</param-name>
<param-value>br.com.caelum.vraptor.util.jpa.JPACustomProvider</param-value>
</context-param>
</web-app>
O que devo mudar nele?
Lucas_Cavalcanti 26 de mai. de 2011
troque o context param que vc pôs por:
<context-param>
<param-name> br.com.caelum.vraptor.packages</param-name>
<param-value> br.com.caelum.vraptor.util.jpa</param-value>
</context-param>
isso já é open session in view
PaduaAlves 26 de mai. de 2011
Diabo_Loiro 27 de jul. de 2012
Ola estou usando o vraptor com o seguinte config
<context-param>
<param-name> br.com.caelum.vraptor.packages</param-name>
<param-value>
br.com.caelum.vraptor.util.hibernate
</param-value>
</context-param>
Continuo tomando LazyInitializationException e sendo obrigado a colocar EAGER nos OneToMany
segue exemplo..
@Entity
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L ;
@Id
@GeneratedValue ( strategy = GenerationType . IDENTITY )
private Long id ;
private String name ;
private String email ;
private String password ;
@OneToMany ( cascade = CascadeType . ALL , mappedBy = "user" )
private Collection < RequestOrder > requestOrder ;
quando do user.getRequestOrder() no jsp tomo LazyInitializationException so para se eu colocar o fecth como EAGER, o opensession view deveria tratar isso sem eu ter que colocar o eager.
podem ajudar?
Lucas_Cavalcanti 28 de jul. de 2012
vc tá recebendo a session no construtor dos seus daos? ou tá criando na mão?
Diabo_Loiro 28 de jul. de 2012
Codigo simplificado para ficar melhor... tirei a camada de bussiness, mais se eu não colocar o fech type como eager eu tomo lazyini e tal.
@Resource
public class IndexController {
private final Result result ;
private final UserDao userDao ;
private final UserSession userSession ;
public IndexController ( Result result , UserDao userDao , UserSession userSession ) {
this . result = result ;
this . userDao = userDao ;
this . userSession = userSession ;
}
@Path ( "/index" )
public void index () {
result . include ( "orderList" , userDao . findById ( userSession . getUser (). getId ()). getRequestOrder ());
}
Lucas_Cavalcanti 28 de jul. de 2012
vc não respondeu minha pergunta… no seu userDao vc está recebendo a session do hibernate no construtor?
Diabo_Loiro 28 de jul. de 2012
Ta recebendo pelo vraptor
@ Component
public class UserDao extends GenericDAO < User > {
public UserDao ( Session session ) {
super ( session );
}
package br.com.persistence ;
import java.io.Serializable ;
import java.lang.reflect.ParameterizedType ;
import java.util.List ;
import org.hibernate.Session ;
import org.hibernate.criterion.Restrictions ;
import br.com.caelum.vraptor.ioc.Component ;
@Component
public abstract class GenericDAO < T extends Serializable > {
protected final Session session ;
private final Class < T > persistentClass ;
@SuppressWarnings ( "unchecked" )
public GenericDAO ( Session session ) {
this . session = session ;
this . persistentClass = ( Class < T > ) (( ParameterizedType ) getClass (). getGenericSuperclass ()). getActualTypeArguments () [ 0 ] ;
}
public Session getSession () {
return session ;
}
public Long save ( T entity ) {
Long saveNumber =- 1L ;
saveNumber = ( Long ) getSession (). save ( entity );
return saveNumber ;
}
public void update ( T entity ) {
getSession (). update ( entity );
}
public void delete ( T entity ) {
getSession (). delete ( entity );
}
@SuppressWarnings ( "unchecked" )
public List < T > findAll (){
return getSession (). createCriteria ( persistentClass ). list ();
}
@SuppressWarnings ( "unchecked" )
public T findByName ( String name ) {
return ( T ) getSession (). createCriteria ( persistentClass ). add ( Restrictions . eq ( "nome" , name ). ignoreCase ()). uniqueResult ();
}
@SuppressWarnings ( "unchecked" )
public T findById ( Integer id ) {
return ( T ) getSession (). createCriteria ( persistentClass ). add ( Restrictions . eq ( "id" , id )). uniqueResult ();
}
@SuppressWarnings ( "unchecked" )
public T findById ( Long id ) {
return ( T ) getSession (). createCriteria ( persistentClass ). add ( Restrictions . eq ( "id" , id )). uniqueResult ();
}
}
Lucas_Cavalcanti 28 de jul. de 2012
acho que sei qual é o problema:
vc carregou um user numa requisição e colocou dentro do userSession, que é session scoped…
qdo vc usa esse usuário em outra requisição, a session que carregou ele já está fechada, por isso o erro…
jeito de resolver isso: carregar todos os dados do usuário que vc for usar dentro do userSession na primeira requisição, ou dar um refresh no usuário do userSession a toda requisição
Diabo_Loiro 28 de jul. de 2012