Problema com Hibernate - Não retorna alguns registros que se encontram no banco

4 respostas
alanclic

UPDATE - Estou colocando os outros métodos que são utilizados no action.
Pessoal,

Estou fazendo várias requisições ajax simultâneas para trazer vários registros de uma tabela, só que de vez em quando ele não retorna nada.

É o seguinte eu tenho uma página que chama várias vezes o loadRSSThreads.action via jquery. O engraçado que se eu tirar o assincronismo do ajax do jquery ele funciona.
Eu acho que pode ser o jeito que eu estou trabalhando com o Session do hibernate.

As vezes no método updateLayoutItemThreads ele não encontra o usuário e não carrega o resto dos dados.

Agradeço muito qualquer ajuda.
Obrigado.

Segue os códigos:

HibernateUtil:

package br.org.indt.myweb.util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {
    public static final SessionFactory sessionFactory;

    static {
	try {
	    // Create the SessionFactory from hibernate.cfg.xml
	    sessionFactory = new AnnotationConfiguration().configure()
		    .buildSessionFactory();
	} catch (Throwable ex) {
	    // Make sure you log the exception, as it might be swallowed
	    System.err.println("Initial SessionFactory creation failed." + ex);
	    throw new ExceptionInInitializerError(ex);
	}
    }

    public static final ThreadLocal session = new ThreadLocal();

    /**
     * Returns or create a new hibernate session. Keeps them bounded to the
     * Thread using the ThreadLocal session static attribute.
     * 
     * @throws HibernateException
     * @return Session
     */

    public static Session getSession() throws HibernateException {
	Session s = (Session) session.get();
	// Open a new Session, if this thread has none yet
	if (s == null) {
	    s = sessionFactory.openSession();
	    // Store it in the ThreadLocal variable
	    session.set(s);
	}
	return s;
    }

    /**
     * Closes a thread-bounded session object into the ThreadLocal session
     * attribute.
     * 
     * @throws HibernateException
     */
    public static void closeSession() {
	try {
	    Session s = (Session) session.get();
	    session.set(null);
	    if (s != null && s.isOpen())
		s.close();
	} catch (HibernateException ex) {
	    System.out.println(ex.getMessage());
	}
    }
}

Action do Struts2:

public String loadRSSThreads() {

	session = this.getSession();
	String login = (String) session.get("userlogged");

	factoryUserManagerWeb = UserManagerWebFactory.getInstance();
	serviceUserManagerWeb = factoryUserManagerWeb
		.getUserManagerWebService();

	List<RSSItemDTO> listRSSItemDTO = new ArrayList<RSSItemDTO>();

	try {

	    String urlRSS = serviceUserManagerWeb.getFeedURL(Long
		    .parseLong(String.valueOf(idRSS)));

	    listRSSItemDTO = serviceUserManagerWeb.getThreadsFromCache(urlRSS);

	    serviceUserManagerWeb.updateLayoutItemThreads(login, idRSS,
		    listRSSItemDTO);

	    rssThreads = serviceUserManagerWeb.getFeedsList(login, idRSS);


	} catch (MyWebException e) {

	}

	return SUCCESS;

    }

getFeedURL

public String getFeedURL(long id) {

	Session session = HibernateUtil.getSession();

	BoxItem boxItem = (BoxItem) session.createQuery(
		"FROM BoxItem WHERE id = ? AND type = ?")
		.setCacheable(false)
		.setLong(0, id)
		.setString(1, "rss").uniqueResult();

	
	HibernateUtil.closeSession();

	return boxItem.getURL();

    }

getThreadsFromCache

public List<RSSItemDTO> getThreadsFromCache(String urlFeed) {

	Session session = HibernateUtil.getSession();
	List<RSSItemDTO> listRSSItemDTO = new ArrayList<RSSItemDTO>();

	System.out.println(urlFeed);

	List<FeedCache> listFeedCache = session.createQuery(
		"FROM FeedCache WHERE url = ?")
	// .setCacheMode(CacheMode.PUT)
		.setString(0, urlFeed).list();

	FeedCache feedCache = listFeedCache.get(0);

	List<ThreadCache> listThreadCache = feedCache.getThreads();

	for (int i = 0; i < listThreadCache.size(); i++) {

	    ThreadCache threadCache = listThreadCache.get(i);
	    RSSItemDTO rssItemDTO = new RSSItemDTO();
	    rssItemDTO.setId(threadCache.getId());
	    rssItemDTO.setTitle(threadCache.getTitle());
	    rssItemDTO.setDescription(threadCache.getDescription());

	    String strContent = threadCache.getContent();

	    rssItemDTO.setContents(strContent);
	    rssItemDTO.setURL(threadCache.getUrl());
	    listRSSItemDTO.add(rssItemDTO);
	}

	HibernateUtil.closeSession();

	return listRSSItemDTO;

    }

updateLayoutItemThreads

public void updateLayoutItemThreads(String login, long idRSS,
	    List<RSSItemDTO> rssList) throws MyWebException {

	Session session = HibernateUtil.getSession();
	Transaction tx = session.beginTransaction();
	
	List<User> listUser = session.createQuery(
		"FROM User as user WHERE user.login = ?").setString(0, login)
		.list();

	User user = listUser.get(0);

	Set<LayoutItem> layoutItems = user.getPreference().getLayout()
		.getItems();

	Iterator<LayoutItem> iterator = layoutItems.iterator();

	while (iterator.hasNext()) {

	    LayoutItem layoutItem = iterator.next();

	    // quando o &#65533; encontrado o idRSS do usuario
	    if (layoutItem.getBoxItem().getId() == idRSS) {

		// remover todos os layoutitemthreads
		session.createSQLQuery(
			"DELETE FROM layoutitemthread WHERE layoutitemid ="
				+ layoutItem.getId()).executeUpdate();
		
		layoutItem.getLayoutItemThreads().clear();

		session.save(layoutItem);

		// adiciona os novos layoutitemthreads
		for (int i = 0; i < rssList.size(); i++) {

		    RSSItemDTO rssItemDTO = rssList.get(i);

		    LayoutItemThread layoutItemThread = new LayoutItemThread();
		    layoutItemThread.setLayoutItem(layoutItem);
		    layoutItemThread.setTitle(rssItemDTO.getTitle());
		    layoutItemThread
			    .setDescription(rssItemDTO.getDescription());

		    String strContent = rssItemDTO.getContents();

		    layoutItemThread.setContent(strContent);
		    layoutItemThread.setURL(rssItemDTO.getURL());
		    session.save(layoutItemThread);
		    layoutItem.getLayoutItemThreads().add(layoutItemThread);
		    session.save(layoutItem);
		}

		session.save(user);
		break;
	    }

	}

	tx.commit();
	HibernateUtil.closeSession();

    }

getFeedsList

public List<RSSItemDTO> getFeedsList(String login, long idRSS) {

	List<RSSItemDTO> listFeeds = new ArrayList<RSSItemDTO>();

	Session session = HibernateUtil.getSession();

	List<User> listUser = session.createQuery(
		"FROM User as user WHERE user.login = ?").setString(0, login)
		.list();

	User user = listUser.get(0);

	Iterator<LayoutItem> iterator = user.getPreference().getLayout()
		.getItems().iterator();

	while (iterator.hasNext()) {

	    LayoutItem layoutItem = iterator.next();

	    if (layoutItem.getBoxItem().getId() == idRSS) {

		List<LayoutItemThread> listLayoutItemThread = layoutItem
			.getLayoutItemThreads();

		for (int i = 0; i < listLayoutItemThread.size(); i++) {

		    RSSItemDTO rssItemDTO = new RSSItemDTO();
		    LayoutItemThread layoutItemThread = listLayoutItemThread
			    .get(i);

		    rssItemDTO.setId(layoutItemThread.getId());
		    rssItemDTO.setTitle(layoutItemThread.getTitle());
		    rssItemDTO.setURL(layoutItemThread.getURL());
		    rssItemDTO
			    .setDescription(layoutItemThread.getDescription());
		    listFeeds.add(rssItemDTO);

		}
		
		break;

	    }

	}

	HibernateUtil.closeSession();

	return listFeeds;

    }

Erro:

p><b>exception</b> <pre>javax.servlet.ServletException: Index: 0, Size: 0

	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:518)

	org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)

</pre></p><p><b>root cause</b> <pre>java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

	java.util.ArrayList.RangeCheck(ArrayList.java:547)

	java.util.ArrayList.get(ArrayList.java:322)

	br.org.indt.myweb.persistence.UserManagerWebDAO.updateLayoutItemThreads(Unknown Source)

	br.org.indt.myweb.action.UserManagerWeb.loadRSSThreads(Unknown Source)

	sun.reflect.GeneratedMethodAccessor86.invoke(Unknown Source)

	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

	java.lang.reflect.Method.invoke(Method.java:597)

	com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:399)

	com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:262)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:224)

	com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor

.java:213)

	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86

)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)

	org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor

.java:48)

	com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86

)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor

.java:123)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.interceptor.ParametersInterceptor.intercept(ParametersInterceptor.java:161)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor

.java:105)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74

)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor

.java:127)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor

.java:107)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206

)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.interceptor.PrepareInterceptor.intercept(PrepareInterceptor.java:115)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170

)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor

.java:176)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:219)

	com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:218)

	com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)

	com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:216)

	org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)

	org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507)

	org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421)

4 Respostas

_fs

O erro ocorre nesta linha?

Se sim, tem certeza que a query deveria retornar resultados? A variável “login” está sendo passada corretamente?

Fora isso, por que não usa Criteria ao invés de HQL e… SQL?

alanclic

Opa Lipe,
Muito obrigado por responder.

Sim ocorre nesta linha.

Eu sei que ele retorna, pois supondo que eu carregue 10 feeds, desses 10, 4 vem ok e 6 não.

Eu fiz um debug e o usuário não retornado.
E o login é passado a todos os requests.

Farei os testes com criteria também.

Obrigado.

_fs

A título de teste, no HibernateUtil ao invés de tentar pegar a Session do objeto ThreadLocal, tente sempre abrir uma nova sessão.

alanclic

Opa Lipe,

Cara fiz novamente o teste agora criando sempre uma nova session.

E continuou o mesmo erro.

Olha o código, fiz somente comentários.

Para fechar as sessions estou utilizando session.close().

package br.org.indt.myweb.util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {
    public static final SessionFactory sessionFactory;

    static {
	try {
	    // Create the SessionFactory from hibernate.cfg.xml
	    sessionFactory = new AnnotationConfiguration().configure()
		    .buildSessionFactory();
	} catch (Throwable ex) {
	    // Make sure you log the exception, as it might be swallowed
	    System.err.println("Initial SessionFactory creation failed." + ex);
	    throw new ExceptionInInitializerError(ex);
	}
    }

    public static final ThreadLocal session = new ThreadLocal();

    /**
     * Returns or create a new hibernate session. Keeps them bounded to the
     * Thread using the ThreadLocal session static attribute.
     * 
     * @throws HibernateException
     * @return Session
     */

    public static Session getSession() throws HibernateException {
	//Session s = (Session) session.get();
	// Open a new Session, if this thread has none yet
	//if (s == null) {
	    Session s = sessionFactory.openSession();
	    // Store it in the ThreadLocal variable
	    //session.set(s);
	//}
	return s;
    }

    /**
     * Closes a thread-bounded session object into the ThreadLocal session
     * attribute.
     * 
     * @throws HibernateException
     */
    public static void closeSession() {
	try {
	    Session s = (Session) session.get();
	    session.set(null);
	    if (s != null && s.isOpen())
		s.close();
	} catch (HibernateException ex) {
	    System.out.println(ex.getMessage());
	}
    }
}

Valeu vei

Criado 25 de março de 2008
Ultima resposta 25 de mar. de 2008
Respostas 4
Participantes 2