IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

NullPointerException en insertion JPA (at BeanValidationEventListener.validate)


Sujet :

JPA Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut NullPointerException en insertion JPA (at BeanValidationEventListener.validate)
    Bonjour,

    j'ai une base de données HSQLDB, et lorsque j'essaye d'inséré en base voila l'exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    java.lang.NullPointerException
    	at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:131)
    	at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:94)
    	at org.hibernate.action.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:160)
    	at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:65)
    	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
    	at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
    	at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
    	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
    	at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)
    	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)
    	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
    	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
    	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808)
    	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782)
    	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786)
    	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:837)
    	at fr.greg.maCompta.server.dao.UtilisateurDao.add(UtilisateurDao.java:54)
    	at fr.greg.maCompta.server.service.InscriptionServiceImpl.inscription(InscriptionServiceImpl.java:27)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
    	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
    	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
    	at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.Server.handle(Server.java:324)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
    Voici le code de ma DAO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    EntityManager em = createEntityManager();
    EntityTransaction tx = em.getTransaction();
    			try {
    				tx.begin();
    				Utilisateur user = new Utilisateur();
    				user.setNom("test");
    				em.persist(user);
    				tx.commit();
    				utilisateurId = utilisateur.getId();
    			} catch (Throwable t) {
    				t.printStackTrace();
    				tx.rollback();
    			} finally {
    				em.close();
    			}
    Voici le code de ma classe gérant mon EntityManager :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("macompta-unit");
     
    	public EntityManager createEntityManager() {
    		return emf.createEntityManager();
    	}
     
    	public static void closeEntityManager() {
    		emf.close();
    	}
    Le code de mon Objet que je souhaite persister :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Entity
    @Table(name = "utilisateur")
    public class Utilisateur implements Serializable {
    	private static final long serialVersionUID = 6435484481277312961L;
     
    	@Id
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	private Long id;
     
    	@Column
    	private String nom;
    Le code de mon persistence.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    <persistence-unit name="macompta-unit" transaction-type="RESOURCE_LOCAL">
    	<provider>org.hibernate.ejb.HibernatePersistence</provider>
     
        <class>fr.greg.maCompta.server.modele.Utilisateur</class>
     
        <exclude-unlisted-classes/>
     
        <properties>
    	  <!-- Database connection settings -->
    	  <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
    	  <!-- <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:serendipitydb" />
          <property name="hibernate.connection.url" value="jdbc:hsqldb:file:/db/serendipitydb" /> 
     
          <property name="hibernate.connection.url" value="jdbc:hsqldb:file:/db/serendipitydb" />-->
          <property name="hibernate.connection.url" value="jdbc:hsqldb:hsql://localhost/db" />
    	  <property name="hibernate.connection.username" value="sa" />
    	  <property name="hibernate.connection.password" value="" />
     
          <!-- JDBC connection pool (use the built-in) -->
    	  <property name="connection.pool_size" value="1" />
     
    	  <!-- SQL dialect -->
    	  <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
     
          <!-- Enable Hibernate's automatic session context management -->
    	  <property name="current_session_context_class" value="thread" />
     
    	  <!-- Disable the second-level cache  -->
    	  <property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
     
    	  <!-- Echo all executed SQL to stdout -->
    	  <property name="hibernate.show_sql" value="true" /> 
    	  <property name="hibernate.format_sql" value="true" /> 
     
    	  <!-- Drop and re-create the database schema on startup -->
    	  <!-- This property should not be set in PRODUCTION environments -->
    	  <property name="hibernate.hbm2ddl.auto" value="create" />
     
    	  <property name="hibernate.c3p0.min_size" value="5" />
    	  <property name="hibernate.c3p0.max_size" value="20" />
    	  <property name="hibernate.c3p0.timeout" value="300" />
    	  <property name="hibernate.c3p0.max_statements" value="50" />
    	  <property name="hibernate.c3p0.idle_test_period" value="3000" />
        </properties>
     
      </persistence-unit>
    Je n'ai plus d'idée pour résoudre ce problème.

    Le select suivant se passe sans encombre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public Utilisateur getUtilisateurFromLogin(String login) {
    		EntityManager em = createEntityManager();
    		Utilisateur utilisateur = null;
    		try {
    			TypedQuery<Utilisateur> query = em.createQuery("FROM Utilisateur WHERE nom = ?1 ", Utilisateur.class);
    			query.setParameter(1, login);
    			List<Utilisateur> utilisateurs = query.getResultList();
    			utilisateur = utilisateurs.isEmpty() ? null : utilisateurs.get(0);
    		} finally {
    			em.close();
    		}
     
    		return utilisateur;
    	}

    Merci d'avance pour votre aide précieuse. Si vous avez besoin de davantage de précisions n'hésitez pas.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2005
    Messages
    588
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2005
    Messages : 588
    Points : 1 230
    Points
    1 230
    Par défaut
    Aucun rapport mais, IMHO, tu n'as pas besoin de <provider>org.hibernate.ejb.HibernatePersistence</provider> Cette option est inutile si tu n'as pas qu'une seule implémentation EJB3...

    Ensuite, il semble bien y avoir un défaut de contrôle dans les sources d'Hibernate (tu peux regarder les sources sur GitHub) ! Quelque soit ta config tu ne devrais pas tomber sur un NullPointer dans Hibernate...

    Il faut regarder du côté de la configuration de la validation des entités: la validation est activée pour la création, la destruction et la mise à jour des entities en base. La validation est un choix par défaut dans Hibernate.

    Si tu veux la supprimer, il suffit de positionner <validation-mode>NONE</validation-mode> dans le persistence.xml! Le mode AUTO est activé par défaut!
    => normalement, tu devrais avoir la même comportement que NONE si hibernate-validator.jar n'est pas dans dans ton classpath (hibernate-validator s'appuie aussi sur validation-api.jar).
    => normalement, aussi, avec Hibernate, tu ne devrais pas avoir besoin d'un Validator même si tu utilises des contraintes...
    => => Bref, normalement tu ne devrais pas avoir de NullPointer ;-)

    Pour tout ce qui concerne la validation je t'invite à lire les Cours de JM Doudoux. Un excellent billet ou celui-ci sur le sujet !

    Bon debug,
    a+
    Philippe

Discussions similaires

  1. Les insertions ne sont pas validées dans la BD
    Par Alexandre le Grand dans le forum Entity Framework
    Réponses: 5
    Dernier message: 17/09/2014, 13h43
  2. Réponses: 0
    Dernier message: 24/10/2013, 10h54
  3. Mon update fait plutôt un insert+JPA
    Par bruneltouopi dans le forum JPA
    Réponses: 0
    Dernier message: 09/06/2013, 21h21
  4. [Struts 2 + Spring 2 + JPA + AJAX] Pb validation
    Par zorka dans le forum Struts 2
    Réponses: 1
    Dernier message: 19/09/2009, 15h55
  5. [Tomcat5] Insertion photo ds pdf. Chemin non valide?
    Par osmoze dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 21/09/2004, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo