2011-12-10 6 views
1

J'ai le problème suivant. J'utilise Spring et JPA (Hibernate) pour conserver les données dans une base de données.
Mais j'ai une erreur lors de la sauvegarde des données. Ma base de données reste vide après la création d'un nouvel utilisateur. Voici les fichiers importants:printemps jpa hibernate écrit à la DB échoue - aucune transaction

UserDao Interface: 

import java.util.List; 

public interface UserDao { 
    public User findById(Integer id); 
    public List<User> findAll(); 
    public User findByEmail(String email); 
    public void save(User user); 
} 

UserDaoImpl:

@Repository 
public class UserDaoImpl implements UserDao { 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    public User findById(Integer id) { 
     return em.find(User.class, id); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<User> findAll() { 
     return (List<User>)em.createQuery("from User u").getResultList(); 
    } 

    @Override 
    public User findByEmail(String email) { 
     User user = null; 
     try 
     { 
      user =  (User)em.createQuery("from User u where u.email = ?1").setParameter(1, email).getSingleResult(); 
     } 
     catch(NoResultException e){} 
     return user; 
    } 

    @Override 
    @Transactional 
    public void save(User user) { 
     em.persist(user); 
    } 
} 

context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd" default-autowire="byName"> 

<context:component-scan base-package="de.bht.swp.lao.ocp" /> 
<context:annotation-config /> 

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="username" value="root" /> 
    <property name="password" value="root" /> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost/ocp" /> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="ocpPU" /> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="showSql" value="true" /> 
     <property name="generateDdl" value="true" /> 
     <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
    </bean> 
    </property> 
    <property name="loadTimeWeaver" ref="loadTimeWeaver"></property> 
</bean> 

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

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> 

<context:load-time-weaver weaver- class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 

</beans> 

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="ocpPU"> 
</persistence-unit> 

Lorsque je crée un nouvel utilisateur je reçois le Errorlog suivant:

14:42:05,703 DEBUG [org.hibernate.event.def.AbstractSaveEventListener] - delaying identity-insert due to no transaction in progress 
14:42:05,704 DEBUG [org.springframework.orm.jpa.EntityManagerFactoryUtils] - Closing JPA EntityManager 
14:42:05,707 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Rendering view  [org.springframework.web.servlet.view.RedirectView: unnamed; URL [/user/login.htm]] in   DispatcherServlet with name 'dispatcher' 
14:42:05,708 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Successfully completed request 

Je pense que une erreur de Trancation. J'ai déjà passé tellement de temps dans d'autres canaux. Que signifie "retarder l'insertion d'une identité en raison de l'absence de transaction en cours"?

merci pour l'aide à l'avance salutations

Répondre

4

Le problème est le @Repository dans UserDaoImpl, retirez-le et faire un haricot

<bean id="userDao" class="de.bht.swp.lao.ocp.user.UserDaoImpl" /> 

dans votre context.xml

Je ne peux pas expliquer ce comportement mais c'est la raison.

+0

thx beaucoup, cela résout le problème – ChristianB

+0

Après quelques mises à jour de version, nous avons commencé à rencontrer cette erreur sur les tâches d'arrière-plan sur certains environnements seulement. La commutation de '@ Repository' à' @ Component' a résolu le problème. Ce serait bien si vous pouviez élaborer. –

Questions connexes