Utilizando Spring, hibernate e JPA, - persistência - resolvido

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

org.hibernate.ejb.HibernatePersistence

Fale seu objetivo. Por que está usando detach?

Então, estou trabalhando dando manutenção em um sistema.

E estou com este problema.

O objeto é fazer a inserção, alteração e delete de um objeto no banco de dados.

Alguns projeto que trabalhei, faz automaticamente, mas com spring jpa. Este não tem spring-jpa. Com a anotação @Transactional, ou no inicio da classe ou nos métodos da classe em sim.

Conseguiu entender ?

Está seguindo algum tutorial ou livro? Pois parece estar fazendo de forma aleatória.

No geral isso é bem básico do JPA/Hibernate, não deve ser difícil encontrar receitas de bolo: https://www.google.com.br/search?safe=active&q=jpa+crud&oq=jpa+crud

E se tiver uma dúvida mais pontual continue postando.

Então, já pesquisei. Segui o que o curso do Alura indica, mas não funciona. Vi várias receitas de bolo, com o você disse, pesquisando no Google. Assim fiz vários testes.

Como não consegui identificar, perguntei aqui,

Acho estranho um tutorial usar detach para o momento de persistir os dados no banco. O primeiro da busca que te passei (devmedia) não faz isso.

Bom, neste tutorial não fala em usar ou não o detach.

Em outros sistemas aqui, utiliza ele sim.

Se em outro sistema funciona, faz igual, copia e cola.

Com detach o erro é:
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

Sem detach o erro é:
14:22:16,622 INFO [stdout] (default task-50) Hibernate: select nextval (‘enderecos.end_pais_pai_id_seq’)

14:22:16,625 ERROR [stderr] (default task-50) javax.persistence.TransactionRequiredException: no transaction is in progress

Entendo que é o mesmo ou não ?

Pela mensagem, não está usando transacao? No exemplo da devmedia estão usando. Tente seguir algo, não conseguindo poste o link do tutorial e fale onde deu errado. A questão do detach é você entender para o que ele serve antes de usar, pois não parece fazer sentido nesse caso.

Entendo que é isto.

mas olhando o tutorial que você passou.

nesta linha:

Cliente c = new Cliente(); // transiente
em.persist©; // gerenciado

Como está preenchido o em ?

Entendo que o em é EntityManager.

Aqui está assim:

    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 está assim:

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

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

             <jta-data-source>java:/desif-ds</jta-data-source>

                         <!!--todas as classes modelos -->
                        <class>br.coom.....</class>

			<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>

Standalone do Wildfly.

    <datasources>
    <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>
                </datasources>

Esse exemplo é bem simples: http://www.universidadejava.com.br/materiais/jpa-exemplo-crud/

Observe que é usado merge quando o registro já existe. Exercita o tutorial antes de partir pro projeto da empresa.

@javaflex, Obrigado pela ajuda.

Consegui resolver mudando o Persistence, e funcionou.

<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>