Problema de persistência (possível configuração do datasource no JBoss AS7)

Fala pessoal!

Tenho aqui na minha empresa um sistema simples, originalmente estrutura para EJB 3.1, JPA 2 (usando eclipselink), JSF 2 rodando sobre o glassfish e usando o postgres 9.1. Ele é basicamente um projeto utilizado a um tempo atrás como prova de conceito.

Estou fazendo a “portabilidade” dele para o JBoss AS7 e no entanto me deparei com um certo problema.

No JBoss, o sistema está conseguindo fazer todas as consultas e exibir os resultados. Mas qualquer solicitação de insert/update/delete resulta em… nada. O sistema não diz que falhou, não gera exception, aliás, passa pelo entitymanager.persist, e simplesmente não persiste nada no banco.

No glassfish tudo funciona muito bem.

Após algumas pesquisas, resolvi testar algumas soluções e a única que funcionou das que encontrei, foi explicitamente abrir a transação, e fazer o commit manualmente. Dai o sistema funciona perfeitamente e faz os inserts e updates. Mas não era pra ser assim, afinal configurei no datasource para ativar o uso de jta. Está igual a configuração do glassfish.

E o mais estranho de tudo é o fato de não gerar nenhum log informando que não existe transação ativa. Será que preciso habilitar algum nivel de log mais detalhado pra obter essas informações, ou o jboss engole mesmo tudo isso?

Enfim, acho que é inviável e uma má pratica abrir a transação e chamar o commit manualmente. Prefiro que o container se vire pra fazer isso, como funciona no Glassfish. Abaixo segue meu arquivo de configuração:

<subsystem xmlns="urn:jboss:domain:datasources:1.0">
            <datasources>
                <datasource jta="true" jndi-name="java:/jdbc/gsp" pool-name="GSP" enabled="true" use-java-context="true" use-ccm="true">
                    <connection-url>jdbc:postgresql://127.0.0.1:5432/gsp</connection-url>
                    <driver-class>org.postgresql.Driver</driver-class>
                    <driver>postgresql</driver>
                    <security>
                        <user-name>scott</user-name>
                        <password>tiger</password>
                    </security>
                </datasource>
                <drivers>
                    <driver name="postgresql" module="org.postgresql">
                        <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
                    </driver>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>

E meu arquivo persistence.xml é o seguinte:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
	xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="GspJPA"
		transaction-type="JTA">
		<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
		<jta-data-source>jdbc/gsp</jta-data-source>
		<class>com.gsp.modelo.entidade.Cargo</class>
		<class>com.gsp.modelo.entidade.Perfil</class>
		<class>com.gsp.modelo.entidade.Usuario</class>
	</persistence-unit>
</persistence>

Alguém sabe se falta alguma configuração?

Como está seu código EJB que faz o CRUD no banco?

D uma olhada aqui http://blog.xebia.com/2011/07/19/developing-a-jpa-application-on-jboss-as-7/, https://community.jboss.org/thread/168958

Eu uso maven no meu e quase morri para configurar tbm…

Luciano, segue o código do meu DAO

@Stateless
@LocalBean
public class CargoDAO {

	@PersistenceContext
	private EntityManager em;

	public void atualizarCargo(Integer id, String nome, String descricao) {
		Cargo cargo = new Cargo();
		cargo.setCargoID(id);
		cargo.setNome(nome);
		cargo.setDescricao(descricao);
		this.em.merge(cargo);
	}

	public void criarCargo(String nome, String descricao) {
		Cargo cargo = new Cargo();
		cargo.setNome(nome);
		cargo.setDescricao(descricao);
		this.em.persist(cargo);
	}

	public void excluirCargo(Integer id) {
		Cargo cargo = this.em.find(Cargo.class, id);
		if (cargo != null) {
			this.em.remove(cargo);
		}
	}

	public List<Cargo> listarTodosCargos() {
		CriteriaBuilder queryBuilder = this.em.getCriteriaBuilder();
		CriteriaQuery<Cargo> queryDefinition = queryBuilder.createQuery(Cargo.class);
		Root<Cargo> cargoRoot = queryDefinition.from(Cargo.class);
		queryDefinition.select(cargoRoot);
		queryDefinition.orderBy(queryBuilder.asc(cargoRoot.get("cargoID")));
		List<Cargo> results = this.em.createQuery(queryDefinition).getResultList();
		return results;
	}
}

Desta forma funciona perfeitamente no glassfish.

Para funcionar no JBoss eu tive que adicionar o beginTransaction e o commit.

Rafael, vou dar uma olhada no link que vc passou. Eu desabilitei o maven pq tava muito, muito, muuuuuuuito lento meu eclipse com ele. Passei umas 2 horas configurando meu eclipse.ini até achar uma configuração boa, mas sempre que o maven começavao update travava o sistema inteiro por uns 5 minutos. Parece que meu antigo dual core era melhor que o quad core que eu tenho hj (mesmo usando todas as versões 64 bits)…

Putz serio que tava lento, então alguma coisa no seu eclipse não esta bem, eu uso o maven no terminal e pelo plugin tbm e funciona de boa, outra coisa da uma olhada do fórum do Jboos que tem um monte de dúvidas de outras pessoas lá tbm, qq coisa posta ai que eu naum sei muito tbm, mas duas cabeças pensam melhor que uma…abrcs

só para teste ja tento deixar assim só para testes, pq no meu com o maven da exception a todo momento em que vou salvar algo com o jta:

<persistence-unit name="GspJPA" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <non-jta-data-source>jdbc/gsp</non-jta-data-source>

JackDanihell,

Tenho usado EJB 3.1/JPA 2 com JBoss 7 sem problemas. Aparentemente seu código está OK e não precisaria e nem poderia usar begin/commit manualmente. Como você não definiu o tipo de gerenciamento de transação no seu EJB, ele vai usar o default, que é CMT - Container Managed Transaction. Nessa configuração o container abre/fecha automaticamente sua transação. Para fazer isso que você comentou, teria que explicitamente mudar o gerenciamento de transação para BTM - Bean Managed Transaction. Mais informações sobre CMT e BMT.

Testes que faria por enquanto:
-Mudaria o provider para o Hibernate
-Colocaria para exibir os sql’s gerados

Só por curiosidade, como você está invocando os métodos desse EJB?

Veja se ajuda também:
http://lucianomolinari.wordpress.com/2012/02/23/criando-um-datasource-no-jboss-7/
http://lucianomolinari.wordpress.com/2012/03/18/testando-aplicacoes-jee6-com-arquillian/

Olá!
Estou com o mesmo problema citado pelo JackDanihell em 09/04/2012. Será que alguém encontrou a solução para o problema?

Obrigado.