web-dev-qa-db-fra.com

La méthode persist () de EntityManager n'insère pas d'enregistrement dans la base de données

J'ai un problème avec la méthode EntityManager.persist(Object). Maintenant, quand je me débarrasse d’autres problèmes, par application, je travaille sans exception, mais l’objet n’est pas placé dans ma base de données.

ma classe d'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
}

mon cours de 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;
    }
}

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

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

Quelqu'un a-t-il une idée de ce qui me manque?

10
Grzzzzzzzzzzzzz

Obtenez-vous une exception spécifique? Il serait utile de savoir ce que c'est si vous l'êtes.

Il existe déjà un certain nombre de problèmes similaires à celui-ci sur Stackoverflow:

Le contexte transactionnel de printemps ne conserve pas les données

Spring, Hibernate & JPA: L'appel persiste sur entitymanager ne semble pas s'engager dans la base de données

Ceci suggère que vous devriez essayer d’ajouter em.flush() après la em.persist(chain) et de modifier les annotations @transactional

Vous devez également vérifier que vous avez activé les annotations transactionnelles via une ligne telle que:

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

dans votre configuration .xml

7
RoryB

Essaye ça:

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

PS: Vous devez également définir une méthode de génération pour votre identifiant.

7
Peter Adrian

Pouvez-vous poster quelle exception obtenez-vous? Je supposerai que votre erreur est que votre persistence.xml ne spécifie pas votre objet "Chaîne".

Vous pouvez spécifier en utilisant cette balise

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

Ou juste 

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

Mettez ceci au-dessus de la balise provider.

En outre, ne jamais définir un numéro pour une colonne étiquetée avec @Id

Lorsque vous utilisez la méthode save () avec une colonne Id avec une valeur définie, hibernate .__ tentera deMETTRE &AGRAVE; JOURNOT INSERT.

Faites ceci: Create getEntityManager, méthode

public EntityManager getEntityManager() {
    return entityManager;
}

Ensuite

@Transactional
public void saveChain(Chain chain) {

    chain.setDate(new Date());
    getEntityManager().persist(chain);
}
1
Bernardo Vale

Utiliser @EnableTransactionManagement dans l'en-tête du fichier de configuration d'AppConfig

0
Randy Orton

L'ajout de ceux-ci à votre web.xml peut résoudre ce problème:

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

résolu mon problème en utilisant 

org.springframework.transaction.jta.JtaTransactionManager

espérons que ce travail! 

0
Wilson Campusano