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?
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
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
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.
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);
}
Utiliser @EnableTransactionManagement dans l'en-tête du fichier de configuration d'AppConfig
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>
résolu mon problème en utilisant
org.springframework.transaction.jta.JtaTransactionManager
espérons que ce travail!