| Author |
Message |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/04/2008 14:22:58
|
leandrosilvaferreira
Joined: 21/01/2008 21:11:03
Messages: 41
Location: Cuiaba - MT
Offline
|
Fala Pessoal.
Estou com um problema usando Hibernate 3 + Annottations + Mentawai.
O Hibernate 3, conforme descrito na referencia :
http://www.hibernate.org/hib_docs/v3/reference/en/html/performance.html#performance-fetching-proxies
por padrao, ao contrario do hibernate 2, carrega todas as associações one-to-one com lazy=true, usando o CGLib para criar uma instância do objeto em forma de proxy, onde segundo a especificação, somente quando qualquer um dos métodos acessores deste objeto for acessado pela primeira vez é que o hibernate então faria o select no banco e popularia o objeto.
Até então, a instância deste objeto ficaria como algo do tipo :
PaisVO$$EnhancerByCGLIB$$880d5b28
e com todos os atributos NULL, menos o id a principio.
Bom, isso é o que seria pra acontecer, mas no meu caso, quando acesso o método do objeto carregado, ele não está fazendo o select no banco e populando os atributos antes de me retornar o valor, e sim já me retorna direto NULL.
A única forma que consegui resolver isso, é no mapeamento das classes, colocar a anotação @Proxy conforme abaixo :
PaisVO :
Code:
@Entity
@Table(name = "pais")
@SequenceGenerator(name="pais_sequence", sequenceName = "pais_sequence", allocationSize = 1)
@Proxy (lazy=false)
public class PaisVO implements Serializable {
.....
}
desta forma, ele desabilita o proxy, e já carrega de uma vez o objeto principal e seus relacionados, porém, em questões de performace, isso é um desastre, uma vez que ficará carregando objetos, leia-se acesso a banco, que não serão necessariamente utilizados.
Procurei bastante, e achei vários problemas semelhantes na utilização de Spring com Hibernate, mas nada que me clareou as idéias a ponto de resolver o problema.
Aqui no forum, econtrei um post até parecido com meu problema, mas que também não ajudou muito :
http://forum.mentaframework.org/posts/list/174.page
Gostaria de uma ajuda dos desenvolvedores do HibernateFilter do mentawai, para um esclarecimento se este problema foi levado em consideração no seu desenvolvimento.
Abaixo segue as configurações das minhas classes caso alguém queira dar uma olhada pra me ajudar :
ApplicationManager :
Code:
public void init(Context application) {
sessionFactory = ConfigSessionFactory.getInstance().getSessionFactory();
ioc("session", Session.class, REQUEST);
ioc("transaction",HibernateTransaction.class, REQUEST);
ioc("paisDao", PaisImpDAO.class);
ioc("estadoDao", EstadoImpDAO.class);
ioc("clienteDao", ClienteImpDAO.class);
ioc("usuarioDao", UsuarioImpDAO.class);
}
public void loadActions() {
List<Filter> commons = new ArrayList<Filter>();
commons.add(new ExceptionFilter());
commons.add(new IoCFilter());
commons.add(new InjectionFilter());
commons.add(new OutputFilter());
commons.add(new HibernateFilter(sessionFactory));
commons.add(new DIFilter());
commons.add(new TransactionFilter(ACOES_COMITAVEIS));
commons.add(new AuthenticationFilter());
addGlobalFilter(commons);
di("session", Session.class);
di("transaction",HibernateTransaction.class);
/**
* Estado
*/
ac = action(EstadoAction.class)
.fwdOk("/jsp/tabelas/EstadoCadastro.jsp")
.fwdError("/jsp/tabelas/EstadoCadastro.jsp");
ac.on(ERROR, "add", new Chain(ac))
.addFilter(new EstadoActionValidator())
.addFilter(new VOFilter(EstadoVO.class,"estadoVO"))
.addFilter(new VOFilter(PaisVO.class, "paisidPais"));
}
EstadoService :
Code:
public Serializable add() throws Exception {
//A instância da classe PaisVO abaixo é carregada através do método loadById do DAO,
//o qual utiliza-se do 'session.load()' e retorna uma instância como PaisVO$$EnhancerByCGLIB$$880d5b28
//e todos seus atributos ficam como NULL, e ao persistir o objeto estadoVO usando o método
// insert do DAO, ele dá a excessão
// not-null property references a null or transient value
// no atributo Pais da classe EstadoVO
PaisVO paisVO = paisDao.loadById(estadoVO.getPais().getIdPais());
estadoVO.setPais(paisVO);
return estadoDao.insert(estadoVO);
}
EstadoImpDAO :
Code:
public class EstadoImpDAO extends HibernateGenericDAO<EstadoVO> implements EstadoDAO {
public EstadoImpDAO() {
super(EstadoVO.class);
}
HibernateGenericDAO :
Code:
public class HibernateGenericDAO<T> implements BaseDao<T> {
protected Class<T> objClass = null;
protected Session session = null;
public HibernateGenericDAO(){
}
public HibernateGenericDAO(Class<T> objKlass) {
this.setObjectClass(objKlass);
}
public void setObjectClass(Class<T> objectKlass) {
this.objClass = objectKlass;
}
public void setSession(Session session) {
this.session = session;
}
public Session getSession(){
return this.session;
}
public T loadById(Serializable id) throws Exception {
return (T) session.load(this.objClass.getName(), id);
}
public Serializable insert(T obj) throws Exception {
Serializable idGerado = session.save(obj);
return idGerado;
}
}
Obrigado
Leandro Ferreira
|
Leandro Ferreira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/04/2008 17:27:52
|
RubemAzenha
Joined: 30/06/2005 23:12:02
Messages: 472
Location: São Paulo, SP
Offline
|
Não entendi exatamente onde o problema esta. No Mentawai?
|
Mentawai Developer |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/04/2008 16:30:56
|
leandrosilvaferreira
Joined: 21/01/2008 21:11:03
Messages: 41
Location: Cuiaba - MT
Offline
|
Fiz o teste, com a mesma arquitetura, mas sem o controle de transações do mentawai, e sem o hibernatefilter que me retorna as sessões.
Adivinhe, funcionou corretamente.
Mas, se opto por usar o mentawai pra me fornecer a session via IOC e controlar as minhas transacoes pelo HibernateTransaction, dá esse erro.
Que ele traz os relacionamentos 1 pra 1 de um VO carregado através do cglib, mas não os popula, deixando esses objetos com as propriedades NULL.
|
Leandro Ferreira |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 17/04/2008 16:34:35
|
IceW0lf
![[Avatar]](/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
Joined: 16/03/2006 08:33:38
Messages: 1546
Location: Brasília
Offline
|
Pergunta.
Quem vem antes no nas configurações do ApplicationManger IoCFilter ou DIFilter ?????
Vi uma vez o Sérgio dizendo que o DI deve vir antes que o IoC.
Sérgio ??????
|
Leiber Wallace
Voixy ::: Soluções em Telecomunicações |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/07/2009 07:34:33
|
Daniel Lima
Joined: 08/07/2009 14:48:10
Messages: 16
Offline
|
leandrosilvaferreira wrote:
Fala Pessoal.
Estou com um problema usando Hibernate 3 + Annottations + Mentawai.
O Hibernate 3, conforme descrito na referencia :
http://www.hibernate.org/hib_docs/v3/reference/en/html/performance.html#performance-fetching-proxies
por padrao, ao contrario do hibernate 2, carrega todas as associações one-to-one com lazy=true, usando o CGLib para criar uma instância do objeto em forma de proxy, onde segundo a especificação, somente quando qualquer um dos métodos acessores deste objeto for acessado pela primeira vez é que o hibernate então faria o select no banco e popularia o objeto.
Até então, a instância deste objeto ficaria como algo do tipo :
PaisVO$$EnhancerByCGLIB$$880d5b28
e com todos os atributos NULL, menos o id a principio.
Bom, isso é o que seria pra acontecer, mas no meu caso, quando acesso o método do objeto carregado, ele não está fazendo o select no banco e populando os atributos antes de me retornar o valor, e sim já me retorna direto NULL.
A única forma que consegui resolver isso, é no mapeamento das classes, colocar a anotação @Proxy conforme abaixo :
PaisVO :
Code:
@Entity
@Table(name = "pais")
@SequenceGenerator(name="pais_sequence", sequenceName = "pais_sequence", allocationSize = 1)
@Proxy (lazy=false)
public class PaisVO implements Serializable {
.....
}
desta forma, ele desabilita o proxy, e já carrega de uma vez o objeto principal e seus relacionados, porém, em questões de performace, isso é um desastre, uma vez que ficará carregando objetos, leia-se acesso a banco, que não serão necessariamente utilizados.
Procurei bastante, e achei vários problemas semelhantes na utilização de Spring com Hibernate, mas nada que me clareou as idéias a ponto de resolver o problema.
Aqui no forum, econtrei um post até parecido com meu problema, mas que também não ajudou muito :
http://forum.mentaframework.org/posts/list/174.page
Gostaria de uma ajuda dos desenvolvedores do HibernateFilter do mentawai, para um esclarecimento se este problema foi levado em consideração no seu desenvolvimento.
Abaixo segue as configurações das minhas classes caso alguém queira dar uma olhada pra me ajudar :
ApplicationManager :
Code:
public void init(Context application) {
sessionFactory = ConfigSessionFactory.getInstance().getSessionFactory();
ioc("session", Session.class, REQUEST);
ioc("transaction",HibernateTransaction.class, REQUEST);
ioc("paisDao", PaisImpDAO.class);
ioc("estadoDao", EstadoImpDAO.class);
ioc("clienteDao", ClienteImpDAO.class);
ioc("usuarioDao", UsuarioImpDAO.class);
}
public void loadActions() {
List<Filter> commons = new ArrayList<Filter>();
commons.add(new ExceptionFilter());
commons.add(new IoCFilter());
commons.add(new InjectionFilter());
commons.add(new OutputFilter());
commons.add(new HibernateFilter(sessionFactory));
commons.add(new DIFilter());
commons.add(new TransactionFilter(ACOES_COMITAVEIS));
commons.add(new AuthenticationFilter());
addGlobalFilter(commons);
di("session", Session.class);
di("transaction",HibernateTransaction.class);
/**
* Estado
*/
ac = action(EstadoAction.class)
.fwdOk("/jsp/tabelas/EstadoCadastro.jsp")
.fwdError("/jsp/tabelas/EstadoCadastro.jsp");
ac.on(ERROR, "add", new Chain(ac))
.addFilter(new EstadoActionValidator())
.addFilter(new VOFilter(EstadoVO.class,"estadoVO"))
.addFilter(new VOFilter(PaisVO.class, "paisidPais"));
}
EstadoService :
Code:
public Serializable add() throws Exception {
//A instância da classe PaisVO abaixo é carregada através do método loadById do DAO,
//o qual utiliza-se do 'session.load()' e retorna uma instância como PaisVO$$EnhancerByCGLIB$$880d5b28
//e todos seus atributos ficam como NULL, e ao persistir o objeto estadoVO usando o método
// insert do DAO, ele dá a excessão
// not-null property references a null or transient value
// no atributo Pais da classe EstadoVO
PaisVO paisVO = paisDao.loadById(estadoVO.getPais().getIdPais());
estadoVO.setPais(paisVO);
return estadoDao.insert(estadoVO);
}
EstadoImpDAO :
Code:
public class EstadoImpDAO extends HibernateGenericDAO<EstadoVO> implements EstadoDAO {
public EstadoImpDAO() {
super(EstadoVO.class);
}
HibernateGenericDAO :
Code:
public class HibernateGenericDAO<T> implements BaseDao<T> {
protected Class<T> objClass = null;
protected Session session = null;
public HibernateGenericDAO(){
}
public HibernateGenericDAO(Class<T> objKlass) {
this.setObjectClass(objKlass);
}
public void setObjectClass(Class<T> objectKlass) {
this.objClass = objectKlass;
}
public void setSession(Session session) {
this.session = session;
}
public Session getSession(){
return this.session;
}
public T loadById(Serializable id) throws Exception {
return (T) session.load(this.objClass.getName(), id);
}
public Serializable insert(T obj) throws Exception {
Serializable idGerado = session.save(obj);
return idGerado;
}
}
Obrigado
Leandro Ferreira
Reacordando o tópico....
Leandro, estou com o mesmo problema. Você achou alguma solução?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/07/2009 10:03:51
|
leandrosilvaferreira
Joined: 21/01/2008 21:11:03
Messages: 41
Location: Cuiaba - MT
Offline
|
Daniel..
A única forma que consegui foi desabilitando a estratégia de proxy nos mapeamentos de minhas entidades com a anotação @Proxy (lazy=false), com o inconveniente do hibernate carregar todos os relacionamentos one-to-one SEMPRE, mesmo eu não utilizando os mesmos.
Code:
@Entity
@Table(name = "pais")
@SequenceGenerator(name="pais_sequence", sequenceName = "pais_sequence", allocationSize = 1)
@Proxy (lazy=false)
public class PaisVO implements Serializable {
.....
}
|
Leandro Ferreira |
|
|
 |
|
|
|
|