2013-02-13 6 views
3

Je suis débutant au printemps. J'essaie de mettre en place une application web simple avec Spring 3.1.3 et JPA 2.0 J'ai ajouté toutes les libs nécessaires à la librairie WEB-INF/lib. Il n'y a pas d'erreur lors du démarrage mais entityManager dans mon fichier DaoImpl est null. Alors, voici ma configuration:Spring + JPA + Hibernate

persistance.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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_2_0.xsd"> 

<persistence-unit name="fcmsServer" transaction-type="RESOURCE_LOCAL"> 
</persistence-unit> 
</persistence> 

FCMs-servlet.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:tx="http://www.springframework.org/schema/tx" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/tx 
     http://www.springframework.org/schema/tx/spring-tx.xsd"> 

<!-- the application context definition for the fcmsServer DispatcherServlet --> 

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="fcmsServer" /> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
    </property> 
    <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.H2Dialect" /> 
     </bean> 
    </property> 
    <property name="persistenceUnitManager"> 
     <bean 
      class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
      <property name="defaultDataSource" ref="dataSource" /> 
     </bean> 
    </property> 
</bean> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="org.h2.Driver" /> 
    <property name="url" value="jdbc:h2:tcp://localhost/~/fcms" /> 
    <property name="username" value="sa" /> 
    <property name="password" value="sa" /> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

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


<bean id="userDao" class="fcms.data.user.UserDAOImpl"> 
</bean> 

<bean name="/user.htm" class="fcms.controller.UserController"> 
</bean> 

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="viewClass" 
     value="org.springframework.web.servlet.view.JstlView"></property> 
    <property name="prefix" value="/WEB-INF/jsp/"></property> 
    <property name="suffix" value=".jsp"></property> 
</bean> 

classe DaoImpl:

@Repository 
public class UserDAOImpl implements UserDAO { 
@PersistenceContext(unitName = "fcmsServer") 
private EntityManager entityManager; 

public void setEntityManager(EntityManager entityManager) { 
    this.entityManager = entityManager; 
} 

@Override 
public User getUserById(long id) { 
    return entityManager.find(User.class,id); 
} 

@Override 
public void addUser(User u) { 
    entityManager.persist(u); 
} 
} 

cl de l'utilisateur ass

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


@Id @GeneratedValue 
private long id; 
@Column(name = "lastName", nullable = false) 
private String lastName; 
@Column(name = "firstName", nullable = false) 
private String firstName; 
@Column(name = "birthDate", nullable = true) 
private Date birthDate; 
private static final long serialVersionUID = 1L; 

}

Alors, quand je tente d'appeler addUser() dans UserController, j'ai NullPointerException pendant persistent.

+0

Plus de détails. Quand j'ai essayé d'obtenir entityManager manuellement: EntityManager em = Persistence.createEntityManagerFactory ("fcmsServer"). CreateEntityManager(); J'ai l'exception suivante: org.hibernate.HibernateException: La connexion ne peut pas être nulle lorsque 'hibernate.dialect' n'est pas défini Peut être que c'est la cause .. –

+0

Votre configuration pour votre entityManager n'est pas correcte. Et, vous ne devriez pas avoir besoin d'utiliser le nom de punit pour obtenir le PersistenceContext puisque vous n'en avez qu'un. Voici un tutoriel étape par étape de ce que vous essayez de faire: http://www.pluralsight.com/training/Courses/TableOfContents/spring-jpa-hibernate – bh5k

+0

Essayez d'utiliser Spring Boot dans votre prochain projet! Vous serez probablement en mesure d'éviter tous ces problèmes! – geoand

Répondre

2

Je pense que vous manquez la configuration de dire au printemps pour rechercher les annotations (ajouter ce qui suit partout entre l'élément <beans>:

<context:annotation-config /> 

Et peut-être vous devez également ajouter le spécifiant le package suivant où vous avez le DAO Mais je ne pense pas que cela est nécessaire

<context:component-scan base-package="your.package" /> 
+0

Malheureusement, cette solution ne résout pas le problème. entityManager est toujours équivalent à null. –

1

ce travaille morceau de code:..

Spring.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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 
     <context:annotation-config /> 
     <context:component-scan base-package="com.package.dao" /> 
     <tx:annotation-driven transaction-manager="transactionManager" /> 
     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
       <property name="persistenceUnitName" value="fcmsServer" /> 
     </bean> 
     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
       <property name="entityManagerFactory" ref="entityManagerFactory" /> 
     </bean>   
</beans> 

haricot Dao:

@Repository 
public class UserDaoBean implements UserDao { 
     @PersistenceContext 
     protected EntityManager em;   
} 

persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence 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" 
      version="1.0"> 
    <persistence-unit name="fcmsServer" transaction-type="RESOURCE_LOCAL"> 

     <class>com.package.entity.</class> 
     <properties> 
      <property name="javax.persistence.jdbc.url" 
       value="jdbc:mysql://localhost:3306/db_name"/> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
      <property name="javax.persistence.jdbc.user" value="admin"/> 
      <property name="javax.persistence.jdbc.password" value="admin"/> 
     </properties> 
    </persistence-unit> 
</persistence> 
+0

Salut, je définis aussi une entitymanagerfactory comme votre ut Je ne suis pas sûr de ce que je devrais donner à l'unité persistence-unit name = "fcmsServer". À quoi cela fait-il référence? –

+0

@ Ferda-Ozdemir-Sonmez: le nom de l'unité de persistance est juste pour l'identifiant unique de votre entityManagerFactory. Ceci est utile lorsqu'une application configure plus d'une base de données/source de données. Vous pouvez donner n'importe quel nom. –

Questions connexes