2012-12-07 17 views
8

Ho riscontrato problemi nell'utilizzo del metodo EntityManager.persist(Object). Ora, quando mi sbarazzo di altri problemi, da app funziona senza eccezioni ma l'oggetto non viene inserito nel mio database.Il metodo persist() di EntityManager non inserisce record nel database

mia classe entità:

@Entity 
@Table(name ="Chain") 
public class Chain implements Serializable{ 

@Id 
@Column(name = "id") 
    private Long id; 
@Column(name = "date") 
    private Date date; 
@Column(name = "name") 
    private String name; 
//setters and getters 
} 

mia classe dao:

@Transactional 
@Repository("ChainDao") 
public class ChainDaoImpl implements ChainDao{ 


    private EntityManager em; 


    @PersistenceContext 
    public void setEntityManager(EntityManager em) { 
     this. em = em; 
    } 

    public int saveChain(Chain chain) { 
     chain.setDate(new Date()); 
     chain.setId((long)44); 
     Boolean a; 
     em.persist(chain); 

     return 222; 
    } 
} 

mio contesto xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
    <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"></property></bean> 


    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

    <bean class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" 
      ref="entityManagerFactory" /> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

e pereistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> 
     <persistence-unit name="sample"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <!-- Scan for annotated classes and Hibernate mapping XML files --> 
     <properties> 
      <property name="hibernate.archive.autodetection" value="class, hbm"/> 
      <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> 
      <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/database"/> 
      <property name="hibernate.connection.username" value="postgres"/> 
      <property name="hibernate.connection.password" value="pwd"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
      <property name="hibernate.show_sql" value="true"/> 
     </properties> 
     </persistence-unit> 

    </persistence> 

Qualcuno ha idea di cosa mi manca?

+0

Non assegnare un ID al vostro soggetto, e lasciare hibernate assegnare su Save (utilizzando uno dei meccanismi di generazione ID). –

+0

se uso '@GeneratedValue (strategy = GenerationType.AUTO)' ottengo 'org.hibernate.exception.SQLGrammarException: impossibile ottenere il successivo valore di sequenza' – Grzzzzzzzzzzzzz

+0

Controllare la configurazione della transazione di primavera, ho avuto un problema simile ed è stato a causa di una configurazione errata della transazione – blob

risposta

7

State ottenendo una deroga specifica? Sarebbe utile sapere di cosa si tratta se lo sei.

ci sono un certo numero di problemi simili a questo già su StackOverflow:

Spring transactional context doesn't persist data

Spring, Hibernate & JPA: Calling persist on entitymanager does not seem to commit to database

Questi suggeriscono che si dovrebbe cercare di aggiungere em.flush() dopo la em.persist(chain), e alterando le @transactional annotazioni

È inoltre necessario verificare di aver abilitato le annotazioni transazionali attraverso una linea come :

<tx:annotation-driven transaction-manager="transactionManager"/> 

nella configurazione .xml

+0

Il fatto è che non ci sono eccezioni, il codice viene eseguito, ma non vi è alcun record inserito nel database. – Grzzzzzzzzzzzzz

+0

Hmm, provate sicuramente em.flush() quindi. – RoryB

+0

quando aggiungo 'flush()' ho ottenuto 'javax.persistence.TransactionRequiredException: nessuna transazione è in corso? Dovrei pubblicare la traccia completa? – Grzzzzzzzzzzzzz

-1

È necessario assegnare strategia id generazione, come di seguito:

@Entity 
@Table(name ="Chain") 
public class Chain implements Serializable{ 

@Id 
@Column(name = "id") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 
@Column(name = "date") 
    private Date date; 
@Column(name = "name") 
    private String name; 
//setters and getters 
} 

e nel metodo Save

public int saveChain(Chain chain) { 
     chain.setDate(new Date()); 
     //chain.setId((long)44); remove this line 
     Boolean a; 
     em.persist(chain); 

     return 222; 
    } 

se si assegna Id, allora hibernate/APP cercherà di aggiornare il record, che è non disponibile, invece di inserire un nuovo record e penso che non genererà eccezioni.

+0

ancora no eccezione o record nel database .. – Grzzzzzzzzzzzzz

+0

prova a svuotare manualmente con 'em.flush()', come è configurata la transazione? –

+0

u significa configurazione a molla? ' ' – Grzzzzzzzzzzzzz

1

Puoi pubblicare quale eccezione stai ricevendo? Assumerò che il tuo errore è che persistence.xml non hai specificato il tuo oggetto "Catena".

È possibile specificare di utilizzare questo tag

<exclude-unlisted-classes>false</exclude-unlisted-classes> 

O semplicemente

<class>your.package.Chain</class> 

Metti questa sopra fornitore tag.

Inoltre, non impostare un numero di una colonna contrassegnati come @Id

Quando si utilizza il metodo save() con una colonna di identificazione con il valore impostato, ibernazione cercherà di UPDATE NON inserisci i tuoi dati.

fare questo: Creare getEntityManager Metodo

public EntityManager getEntityManager() { 
    return entityManager; 
} 

Poi

@Transactional 
public void saveChain(Chain chain) { 

    chain.setDate(new Date()); 
    getEntityManager().persist(chain); 
} 
+0

Ancora non fa eccezione e senza alcuna registrazione nel database – Grzzzzzzzzzzzzz

+1

OMG, ho trascorso alcune ore con questo problema = P .. nel mio caso sto usando Camel, primavera e Hibernate JPA + .. ho dimenticato un piccolo dettaglio. mancava la ** annotazione Transactional ** in My ** @ Metodo di servizio **. Grazie per ** il suggerimento su flush **. Ho appena inserito lo svuotamento e nel registro appare l'eccezione a lungo attesa. bel link sulle possibili cause: http://www.scarba05.co.uk/blog/2010/02/hibernate-jpa-is-swallowing-my-data-no-save-no-error/ –

+0

grazie ho risparmiato il mio tempo Era dovuto a em.flush(). –

5

Prova questa:

em.getTransaction().begin(); 
em.persist(entity); 
em.getTransaction().commit(); 

PS: È necessario impostare un metodo di generazione per l'ID pure.

+3

'Non è consentito creare transazioni su EntityManager condiviso - utilizzare transazioni Spring o EJB CMT invece ' – Grzzzzzzzzzzzzz

+1

Un EntityManager JTA non può utilizzare getTransaction() – Julien

-1

sono stato in grado di risolvere lo stesso problema aggiungendo l'Ente per persistence.xml:

<persistence-unit name="OwnerPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>com.test.domain.local.Entity</class> 
    <exclude-unlisted-classes /> 
    </persistence-unit> 
</persistence> 
0

Aggiunta di questi alla vostra web.xml può risolvere questo problema:

<!-- Open Entity Manager in View filter --> 
<filter> 
    <filter-name>openEntityManagerInViewFilter</filter-name> 
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>openEntityManagerInViewFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
0

risolto il mio problema utilizzando

org.springframework.transaction.jta.JtaTransactionManager 

ho questo lavoro!

0

Usa @EnableTransactionManagement in intestazione del file di configurazione AppConfig

Problemi correlati