Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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.