[Resolvido] PrimeFaces + dataGrid lazy = erro [Resolvido]

Dae rapaziada,

volta e meia tenho problema com o dataGrid do prime utilizando o lazy,
tenho 10 registros no total.
Na primeira pagina com 5 registros ok, qndo tento mudar para a segunda pagina
ocorre o erro

10:47:37,757 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8080-1) SQL Error: 0, SQLState: 24000
10:47:37,758 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (http-localhost-127.0.0.1-8080-1) ResultSet may only be accessed in a forward direction.
10:47:37,760 ERROR [org.jboss.as.ejb3.tx.CMTTxInterceptor] (http-localhost-127.0.0.1-8080-1) javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.GenericJDBCException: ResultSet may only be accessed in a forward direction.

alguém já teve esse problema? alguém usa e funciona corretamente?

ResultSet may only be accessed in a forward direction.

Vc ta paginando isso direto do hibernate?

na implementação do método load do lazydatamodel
faço assim

listEntity = ejb.findAllLimit(nomeEntity, startResults, maxPerPage);
@Override
	public List<Entity> findAllLimit(String nomeEntity, Integer startResults, Integer maxPerPage) throws Exception{
		Query query = getEntityManager().createQuery("select x from "+nomeEntity+" x");
		query.setFirstResult(startResults);
		query.setMaxResults(maxPerPage);
		List resultList = query.getResultList();
		return resultList;
	}

É cara, ta estranho pacas.

O que tem no método: getEntityManager()?

Outra coisa, você colocou o atributo do datatable lazy=“true” ?

[quote=Hebert Coelho]É cara, ta estranho pacas.

O que tem no método: getEntityManager()?
r:

public class ProjetoEJBImpl extends BaseEJBImpl implements ProjetoEJB {

	@EJB
	private PersistenceSetup jpaSetup;
	
	@Override
	public EntityManager getEntityManager() {
		return jpaSetup.createEntityManager();
	}

}

onde esse PersistenceSetup vai me dar um entity manager de acordo com a base que o usuário fez o login.

Outra coisa, você colocou o atributo do datatable lazy=“true” ?[/quote]
r: Sim

E o que tem aqui?
return jpaSetup.createEntityManager();

[quote=Hebert Coelho]E o que tem aqui?
return jpaSetup.createEntityManager(); [/quote]Esse cara é injetado? Você cria na mão? Pq vc ta fazendo isso e não usando a injeção do EJB?

o mais estranho é que essa implementação é usada em outro projeto, "exatamente igual"
e não da esse problema.

aqui o conteudo do PersistenceSetup

@Stateless
@Startup
@LocalBean
@BaseType
@SuppressWarnings("all")
public class PersistenceSetup {
	
	@Resource(mappedName = "java:comp/TransactionSynchronizationRegistry")
	private TransactionSynchronizationRegistry registry;
	
	private Map<String, EntityManagerFactory> factories = new HashMap<String, EntityManagerFactory>();

	@PostConstruct
	public void startup() throws Exception {
		
		String pastaConfig="configuracoes";
		String arquivoConfig = "persistence.properties";
		String separator = System.getProperty("file.separator");    	
		String jbossHome = System.getProperty("jboss.home.dir");
		String file = jbossHome+separator+pastaConfig+separator+arquivoConfig;
		
		InputStream is = new FileInputStream(file);
		
		Properties properties = new Properties();
		properties.load(is);
		
		Integer jpaInstances = new Integer(properties.getProperty("jpa.instances"));
		String jpaUnitName = properties.getProperty("jpa.persistence.unit.name");
		for (int i = 1; i <= jpaInstances; i++) {
			HashMap<String, String> jpaProperties = new HashMap<String, String>();
			for (Object obj : properties.keySet()) {
				String key = (String) obj; 
				if (key.startsWith(String.valueOf(i))) {
					jpaProperties.put(key.replaceAll(i + ".", ""), properties.getProperty(key));
				} 
			}
			String persistenceName = properties.getProperty(i + "." + PERSISTENCE_NAME);
			EntityManagerFactory factory = Persistence.createEntityManagerFactory(jpaUnitName, jpaProperties);
			factories.put(persistenceName, factory);
		}

	}
	
	@PreDestroy
	public void shutdown() throws Exception {
		for (EntityManagerFactory factory : factories.values()) {
			if (factory.isOpen()) {
				factory.close();
			}
		}
	}
	
	public Set<String> getPersistenceNames() {
		return factories.keySet();
	}
	
	public EntityManager createEntityManager(String persistenceName) {
		EntityManager manager = (EntityManager) registry.getResource(ENTITY_MANAGER_KEY);
		if (manager == null) {
			EntityManagerFactory factory = factories.get(persistenceName);
			manager = factory.createEntityManager();
			registry.putResource(ENTITY_MANAGER_KEY, manager);
			registry.registerInterposedSynchronization(new TransactionSynchronization(manager));
		}
		return manager;
	}
	
	public EntityManager createEntityManager() {
		String persistenceName = (String) registry.getResource(PERSISTENCE_NAME);
		EntityManager manager = createEntityManager(persistenceName);
		return manager;
	}
	
	class TransactionSynchronization implements Synchronization {
		EntityManager manager;
		public TransactionSynchronization(EntityManager manager) {
			this.manager = manager;
		}
		@Override
		public void afterCompletion(int status) {
			manager.close();
		}
		@Override
		public void beforeCompletion() {}
	}
	
}

É cara, vou deixar outra pessoa te ajudar. Você com EJB está fazendo controle manual do EntityManager, algo que não vejo por que.

Não é só pq é o mesmo utilizado em outro projeto que não venha a dar problema aí, um controle tão delicado como esse que vc está usando depende de várias variáveis.

Até mais.

[quote=Hebert Coelho]É cara, vou deixar outra pessoa te ajudar. Você com EJB está fazendo controle manual do EntityManager, algo que não vejo por que.

Não é só pq é o mesmo utilizado em outro projeto que não venha a dar problema aí, um controle tão delicado como esse que vc está usando depende de várias variáveis.

Até mais.[/quote]

você tem alguma sugestão de fazer com que exista múltiplas bases, e que nenhuma delas
seja subida automaticamente com o servidor no momento do start?

[quote=kleberdamasco][quote=Hebert Coelho]É cara, vou deixar outra pessoa te ajudar. Você com EJB está fazendo controle manual do EntityManager, algo que não vejo por que.

Não é só pq é o mesmo utilizado em outro projeto que não venha a dar problema aí, um controle tão delicado como esse que vc está usando depende de várias variáveis.

Até mais.[/quote]

você tem alguma sugestão de fazer com que exista múltiplas bases, e que nenhuma delas
seja subida automaticamente com o servidor no momento do start?[/quote]Não. [=

Até hoje nunca precisei fazer, ou ouvi sobre tal requisito. Caso eu fique sabendo de algo e posto aqui novamente. [=

Já ouviu falar do Hibernate Shards? Pode ser que te ajude (eu não sei quanto à base não subir automaticamente).

http://www.hibernate.org/subprojects/shards.html

[quote=Rodrigo Sasaki]Já ouviu falar do Hibernate Shards? Pode ser que te ajude (eu não sei quanto à base não subir automaticamente).

http://www.hibernate.org/subprojects/shards.html[/quote]

vou dar uma olhada,
vc já utilizou e/ou tem conhecimento?

Resolvido com essa propriedade

<property name="hibernate.jdbc.use_scrollable_resultset"
				value="false" />