EntityManager ne peut pas utiliser persistent pour économiser de l'élément à la base de données
J'ai rencontré le problème de la persistance de l'élément à la base de données à l'aide de l'EntityManager. Sur la base des réponses que j'ai trouvé, j'ai essayé ces 4 façons dans mon DaoJpa de faire une telle chose, mais encore échoué. Ici j'ai attaché les quatre façons j'ai essayé:
Code de Contrôleur de la partie:
@Transactional
SmartProduct smartProduct = new SmartProduct();
smartProduct.setName("Dove Soap");
smartProductDao.persist(smartProduct);
1.
DaoJpa:
@Transactional
public void persist(SmartProduct smartProduct) {
entityManager.persist(smartProduct);
Ne fonctionne pas!
2.
@Transactional
public void persist(SmartProduct smartProduct) {
entityManager.persist(smartProduct);
entityManager.flush();
Exception que j'ai eu: aucune transaction n'est en cours
3.
@Transactional
public void persist(SmartProduct smartProduct) {
EntityTransaction emTransaction = entityManager.getTransaction();
emTransaction.begin();
entityManager.persist(smartProduct);
emTransaction.commit();
entityManager.close();
Exception que j'ai obtenu:
Pas autorisés à créer de la transaction sur le partage de l'EntityManager - utiliser le Printemps
des transactions ou des EJB CMT au lieu
4.
@Transactional
public void persist(SmartProduct smartProduct) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit");
EntityManager em = emf.createEntityManager();
EntityTransaction etx = em.getTransaction();
etx.begin();
em.persist(smartProduct);
etx.commit();
em.close();
emf.close();
Exception que j'ai obtenu:
L'application doit fournir des connexions JDBC
Quelqu'un pourrait-il m'aider à comprendre le problème s'il vous plaît? Merci beaucoup d'avance!
Merci beaucoup JustinKSU de l'aide. J'ai ajouter l'annotation au Printemps contexte, et c'est résolu!
Voici la version précédente de mon Ressort contexte:
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnit" />
<property name="dataSource" ref="dataSource" />
</bean>
Après l'ajout de la
<tx:annotation-driven />
cela fonctionne:
<tx:annotation-driven />
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnit" />
<property name="dataSource" ref="dataSource" />
</bean>
- Avez-vous essayé d'utiliser @Transactional sur la poursuite de la méthode?
- Désolé j'ai oublié de le mentionner dans le post. Oui j'ai ajouté @Transactional avant la méthode dans tous les quatre façons. Aussi j'ai essayé d'ajouter (readOnly = true)/(readOnly = false)après Transactionnelle annotation, et a même ajouté (propagation = Propagation.NÉCESSAIRE), mais ne semble pas faire de différence.
- Êtes-vous à l'aide de @PersistenceContext à injecter de l'entityManager?
- Oui je l'ai ajouté au début de la manette: @PersistenceContext private EntityManager entityManager;
- Si vous êtes à l'aide d'annotations avez-vous cela dans votre Printemps contexte <tx:annotation-driven /> avec la définition d'un transactionManager d'injecter de l'entité gestionnaire?
- J'ai vérifié les haricots dans les Éléments de Ressort, et en vertu de la section Transactionnelle, il est "context:component-scan smartProductDaoJpa", qui est la Jpa-je utiliser l'entityManager à persister choses. mais pas sûr de savoir si est-ce le contexte que vous avez mentionné
Vous devez vous connecter pour publier un commentaire.
Pour activer @Transactional dans votre Printemps contexte, vous devriez disposer des éléments suivants:
Appropriée pour votre version de Printemps:
Activer les annotations:
Déclarer votre gestionnaire de transactions injection de votre gestionnaire d'entité:
Si vous avez encore ce problème et toutes les configurations sont ok, assurez-vous que le @Transaction méthode annotée est public, ne sont pas protégés afin d'être identifiés et gérés par le gestionnaire de transactions.
public
. Aussi il précise que lorsqu'il est ajouté<tx:annotation-driven />
résout le problème. Je ne vois pas votre réponse en ajoutant quelque chose à la discussion.