Solucionado (ver solução)
Solucionado
(ver solução)
19
respostas

Utilizando Spring, hibernet e JPA, - persistência

Utilizando Spring, hibernet e JPA.

Já tentei destas 4 maneiras e nenhum eu consegui persistir.:

 private Object persist(Object objeto) {
    EntityTransaction et = entityManager.getTransaction();
    et.begin();
    entityManager.detach(objeto);
    entityManager.persist(objeto);
    entityManager.flush();
    et.commit();
    }
    private Object persist(Object objeto) {
    entityManager.detach(objeto);
    entityManager.persist(objeto);
    entityManager.flush();
    }
        @Transactional
        private Object persist(Object objeto) {
            entityManager.detach(objeto);
            entityManager.persist(objeto);
            entityManager.flush();
            return objeto;
        }
        @Transactional
        private Object persist(Object objeto) {
             EntityTransaction et = entityManager.getTransaction();
             et.begin();
            entityManager.detach(objeto);
            entityManager.persist(objeto);
            entityManager.flush();
             et.commit();
            return objeto;
        }
private EntityManagerFactory factory;
        private EntityManager entityManager;

        public EntityManager getEntityManager() {
            if (entityManager == null) {
                try {
                    // Obtém o factory a partir da unidade de persistência.
                    factory = Persistence.createEntityManagerFactory("desif");
                    // Cria um entity manager.
                    entityManager = factory.createEntityManager();
                    // Fecha o factory para liberar os recursos utilizado.
                } finally {
                    // factory.close();
                }
            }
            return entityManager;
        }

persistence

<persistence-unit name="desif" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
                 <properties>
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="false" />
            <property name="show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>
19 respostas

Fala ai Guilherme, de boa ?

Cara chega a dar algum erro ?

Além disso, onde está a configuração para acesso ao banco ?

A configuração está pelo standalone.xml do wildfly.

<datasource jta="true" jndi-name="java:/desif-ds" pool-name="desif" enabled="true" use-java-context="true">
                    <connection-url>jdbc:postgresql://localhost:5432/desif</connection-url>
                    <driver>postgresql</driver>
                    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
                    <pool>
                        <min-pool-size>10</min-pool-size>
                        <max-pool-size>100</max-pool-size>
                        <prefill>true</prefill>
                    </pool>
                    <security>
                        <user-name>postgres</user-name>
                        <password>63Netsis417</password>
                    </security>
                    <statement>
                        <prepared-statement-cache-size>32</prepared-statement-cache-size>
                        <share-prepared-statements>true</share-prepared-statements>
                    </statement>
                </datasource>
<drivers>
                    <driver name="postgresql" module="org.postgresql">
                        <xa-datasource-class>org.postgresql.Driver</xa-datasource-class>
                    </driver>
                </drivers>

O erro é este

14:20:46,393 INFO [stdout] (default task-61) Hibernate: select nextval (‘enderecos.end_pais_pai_id_seq’)

14:20:46,417 ERROR [stderr] (default task-61) javax.persistence.TransactionRequiredException: no transaction is in progress

Guilherme, tenho minhas dúvidas se o spring consegue pegar essa configuração.

Contudo você pode pedir para injetar o entitymanager através da anotação @PersistenceContext

Então, a consulta está fazendo.

Já tentei com esta anotação @PersistenceContext, mas nem fazer consulta ele faz.

Será que não tá relacionado ao método ser privado ?

Qual deles ?

Mas estão na mesma classe.

Digo pelo caso da anotação @Transactional

Vou testar aqui.

Mudei para public, mesmo erro

    @Transactional
    public Object persist(Object objeto) {
        entityManager.detach(objeto);
        entityManager.persist(objeto);
        entityManager.flush();
        return objeto;
    }

Você precisa fazer esse detach ? não pode só fazer o persist ?

Mesmo sem o detach , mesmo erro no transaction is in progress

Tudo bem Guilherme?

Na sua tag persistence-unit põe JTA no transaction-type no lugar de RESOURCE_LOCAL. Isso indica que o container vai se responsabilizar pelas transações e etc. Além disso você vai precisar informar o JNDI. No seu caso seria algo como:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence ...>
    <persistence-unit name="desif" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <!-- java transaction api || JNDI -->
        <jta-data-source>java:/desif-ds</jta-data-source>
        <properties>
           ...
        </properties>
    </persistence-unit>
</persistence>

Alem disso seria ver se o Spring nao precisa de nenhuma configuração extra... Mas testa esse primeiro e avisa pra gente no que deu. ;)

[]'s

PS: Como o servidor que gerencia tudo agora, provavelmente você vai ter que receber o EntityManager usando o @PersistenceContext(unitName = "desif") e tambem, usar o @Transactional.

Faz sentido?

[]'s

Mudei, agora o erro é no transaction is in progress

Do jeito anterior, só não estava inserindo, mas consulto, excluo e update.

Deste jeito agora, só faço consulta.

O persitence ficou assim:

<persistence-unit name="desif" transaction-type="JTA">

        <!-- <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> -->

        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <jta-data-source>java:/desif-ds</jta-data-source>
<properties>
            <!-- Configurações específicas do Hibernate -->
            <property name="hibernate.connection.username" value="postgres" />
            <property name="hibernate.connection.password" value="63Netsis417" />
            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
            <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/desif" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.hbm2ddl.auto" value="none" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="false" />
            <property name="show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

Isto não fiz.

PS: Como o servidor que gerencia tudo agora, provavelmente você vai ter que receber o EntityManager usando o @PersistenceContext(unitName = "desif") e tambem, usar o @Transactional.

Faz sentido?

No meu entendimento sim.

Vou testar

solução!

Mudando o persistence para

<persistence-unit name="desif" transaction-type="RESOURCE_LOCAL">
        <!-- <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> -->
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <non-jta-data-source>java:/desif-ds</non-jta-data-source>

funcionou tudo.

Qual é a diferença entre < non-jta-data-source> e < jta-data-source> ?

Oi Guilherme!

Que bom que funcionou!

O <non-jta-data-source> basicamente indicar que você nao vai conseguir usar JTA. É o que deve ser utilizado quando você define um DataSource mas o seu transaction-type é RESOURCE_LOCAL.