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?
Distinguir entre os estados de uma entidade no JPA/Hibernate é difícil no início. Um objeto é dito transiente quando não tem representação no banco de dados e nem o EntityManager o conhece, como abaixo: Aqui, …
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>