Problema com Persistência e Transações

5 respostas
diogozero

Olá amigos do GUJ,

Estou tentando fazer uma aplicação que usa JOTM como Gerenciador de Transações e JPA com Hibernate como provedor de persistência.
Estou tendo um problema quando vou abrir uma transação pra fazer qualquer operação... a transação parece estar ativa, ATÉ o momento em que eu uso em.flush(); e ele informa que precisa que uma transação esteja ativada :S

Meu código está assim:
public void persist(T obj) {
        try {
            Context ctx = (Context) new InitialContext().lookup("java:comp");
            UserTransaction us = (UserTransaction) ctx.lookup("UserTransaction");
            us.begin();

            this.em.persist(obj);

            this.em.flush();

            us.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Meu arquivo context.xml
<?xml version="1.0" encoding="UTF-8"?>

<Context antiJARLocking="true" path="/LetsParty">
    <Transaction
    name="UserTransaction"
    auth="Application"
    type="javax.transaction.UserTransaction"
    factory="org.objectweb.jotm.UserTransactionFactory"
    jotm.timeout="60"/>
</Context>

Alguem sabe dizer o problema?

5 Respostas

RenanRosa
diogozero:
Olá amigos do GUJ,

Estou tentando fazer uma aplicação que usa JOTM como Gerenciador de Transações e JPA com Hibernate como provedor de persistência.
Estou tendo um problema quando vou abrir uma transação pra fazer qualquer operação... a transação parece estar ativa, ATÉ o momento em que eu uso em.flush(); e ele informa que precisa que uma transação esteja ativada :S

Meu código está assim:
public void persist(T obj) {
        try {
            Context ctx = (Context) new InitialContext().lookup("java:comp");
            UserTransaction us = (UserTransaction) ctx.lookup("UserTransaction");
            us.begin();

            this.em.persist(obj);

            this.em.flush();

            us.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Meu arquivo context.xml
<?xml version="1.0" encoding="UTF-8"?>

<Context antiJARLocking="true" path="/LetsParty">
    <Transaction
    name="UserTransaction"
    auth="Application"
    type="javax.transaction.UserTransaction"
    factory="org.objectweb.jotm.UserTransactionFactory"
    jotm.timeout="60"/>
</Context>

Alguem sabe dizer o problema?

Cara, eu nunca usei o JOTM, nem sei o por que está usando ali, sendo que não vi nenhum relacionamento nele com o JPA/Hibernate
o erro está acusando que o Transaction está fechado, teria que fazer:

this.em.getTransaction().begin();

diogozero

É um projeto da faculdade…
No caso eu tenho que criar a transação usando JOTM e não usando a transação do JPA.

RenanRosa

diogozero:
É um projeto da faculdade…
No caso eu tenho que criar a transação usando JOTM e não usando a transação do JPA.

Não conheço JOTM, mas acho que isso pode ajudar:
http://community.jboss.org/wiki/Sessionsandtransactions

diogozero

Consegui “resolver” o aviso em que ele dizia que não existia uma Transação ativa adicionando essas linhas no persistence.xml

<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JOTMTransactionManagerLookup"/> <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/> <property name="jta.UserTransaction" value="java:comp/UserTransaction"/>

Porém, agora ele não persiste! Nem mostra exceção nenhuma… agora sim, to totalmente perdido!

diogozero

Não consegui resolver o problema ainda, mas consegui uma “solução alternativa”.

Creio que o problema estava em atributos @Lob… na minha classe de entidade eu tinha um atributo byte[] marcado como @Lob, tentei desmarcar ela e funcionou, inclusive persistiu o array de bytes direitinho no banco. Coisa que eu não entendi, porque na especificação de JPA diz para marcar como @Lob objetos grandes, tipo imagens, arquivos e textos longos.

Mesmo dando certo, fiquei com essa dúvida: porque dá certo sem a anotação?

Criado 6 de maio de 2011
Ultima resposta 10 de mai. de 2011
Respostas 5
Participantes 2