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

Hibernate Java Discussion :

null or transient value error


Sujet :

Hibernate Java

  1. #1
    Membre éclairé
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Par défaut null or transient value error
    Voilà, j'ai fait une couche modèle pour faire persister mes données avec hibernate et JPA.
    Je fais une couche de controle qui me permet de créer des utilisateurs et des documents en vérifiant que les valeurs saisies par les interfaces (vues) sont conformes.

    J'ai une classe UserControl qui me permet de créer un utilisateur.
    J'ai une classe CommentsControl qui me permet de créer un commentaire.
    Dans certains cas, l'utilisateur autheur d'un commentaire doit être créé en même temps que le commentaire.
    Du coup j'ai fait une méthode qui me permet de créer l'utilisateur, de le récupérer et de créer le commentaire. Cette méthode est dans la classe CommentsControl et appelle des méthodes de UserControl (create user et get user en gros).

    Sauf que j'ai une erreur comme si il était impossible de récupérer l'utilisateur ou qu'il est impossible de le faire persister (enfin, ça c'est mon interprétation personnelle de l'erreur).

    L'erreur :
    javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: fr.natoine.persistence_user.User.login
    at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226)
    at fr.natoine.controler.post.CommentsControl.createCommentAndAuthor(CommentsControl.java:144)
    at fr.natoine.controler.post.CommentsControlerTest.testCreateCommentAndAuthor(CommentsControlerTest.java:37)
    Le code est le suivant :
    CommentsControl :
    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
     
    public static void createCommentAndAuthor(EntityManagerFactory emf , String _title , String _effective_comment, String _url , String _username , String _usermail , String _context)
    	{
    		_username = StringOp.deleteBlanks(_username);
    		_usermail = StringOp.deleteBlanks(_usermail);
    		_effective_comment = StringOp.deleteBlanks(_effective_comment);
    		_title = StringOp.deleteBlanks(_title);
    		if(!StringOp.isNull(_username) && !StringOp.isNull(_usermail) && !StringOp.isNull(_effective_comment))
    		{
    		EntityManager em = emf.createEntityManager();
    		//EntityTransaction tx = em.getTransaction();
    	    	//Utilisateur autheur du commentaire
    		UserControl.createUserNoPassword(emf,_username , _usermail, _context);
    		User _author = UserControl.getUserByName(em, _username , _context);
    		//Récupération des paramétres du formulaire 
    		Date _now = new Date();
    		//récupération du PostType comment
    		PostType _commentType = PostControl.getPostTypeComment(emf , em);
    		//créer un DocumentPost
    		DocumentPost _post_comment = new DocumentPost();
    		_post_comment.setContext(_context);
    		_post_comment.setCreation_in_context(_now);
    		_post_comment.setComment(_effective_comment);
    		_post_comment.setCreator(_author);
    		_post_comment.setTitle(_title);
    		_post_comment.setType(_commentType);
    		//créer une annotation de document
    		AnnotationDocument _annot = new AnnotationDocument();
    		Collection<Document> _annotatedDocuments = new ArrayList<Document>();
    		//créer le document HTML qui est commenté
    		DocumentHTML _doc = DocumentControl.createDocumentHTML(emf, _context, _url, "", _now);
     
    		_annotatedDocuments.add(_doc);
    		_annot.setAnnotated_documents(_annotatedDocuments);
    		_annot.setAuthor(_author);
    		_annot.setContent(_post_comment);
    		_annot.setCreation_date(_now);
     
    		EntityTransaction tx = em.getTransaction();
    		tx.begin();
    		em.persist(_post_comment); //ligne 144
    	    	em.persist(_annot);
    	    	tx.commit();
    	    	em.close();
    		}
    	}
    UserControl :
    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
     
    	public static void createUserNoPassword(EntityManagerFactory emf, String login , String mail , String context_inscription)
    	{
    		login = StringOp.deleteBlanks(login);
    		if(!StringOp.isNull(login) && StringOp.isValidMail(mail))
    		{
    			EntityManager em = emf.createEntityManager();
    	        EntityTransaction tx = em.getTransaction();
    	        tx.begin();
    	        try
    	        {
    	        	User _guest = new User();
    	        	_guest.setContext_inscription(context_inscription);
    	        	_guest.setInscription(new Date());
    	        	_guest.setLogin(login);
    	        	_guest.setMail(mail);
    	        	em.persist(_guest);
    	        	tx.commit();
    	        }
    	        catch(Exception e)
    	        {
    	        	 System.out.println( "[UserControl.createUser] unable to persist user : " + login );
    	        	 System.out.println(e.getMessage());
    	        	 tx.rollback();
    	        }
    	        em.close();
    		}
    	}
     
    public static User getUserByName(EntityManager em , String login, String _context)
    	{
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            List users = em.createQuery("from User where login = '" + login + "'").getResultList();
           	tx.commit();
            if(users.size()>0)
            {
            	User _user = (User)users.get(0);
                return _user;
            }
            else
            { 	
            	return new User();
            }
    	}
    Le code de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void testCreateCommentAndAuthor()
    	{
    		EntityManagerFactory emf = Persistence.createEntityManagerFactory("AnnotationsControlerTest");
    		CommentsControl.createCommentAndAuthor(emf, "_title comment test", "_effective_comment", "url test createCommentAndAuthor", "_username", "_usermail", "[CommentsControlerTest.testCreateCommentAndAuthor]");
    	}
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    L'erreur c'est que tu essayes de sauvegarder un utilisateur avec une propriété "login" dont tu as déclaré qu'elle ne pouvait pas être null, et là elle l'est.

    Question : ta fonction StringOp.isNull vérifie-t-elle le cas d'une chaine vide ? Sinon, c'est potentiellement de là que vient le souci (pas possible de sauver une chaine vide dans une base Oracle, il le convertit en null).

  3. #3
    Membre éclairé
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Par défaut
    justement ma fonction StringOp.isNull vérifie que le login n'est pas null.
    Et en l'occurence je l'appelle avec la valeur "_username" pour le login.
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Mais donc, elle vérifie aussi le cas de la chaine vide ? On va dire que oui sinon autant utiliser directement != null.

    Question 2 : ta propriété login n'aurait pas été déclaré transiente, à tout hasard ?

  5. #5
    Membre éclairé
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Par défaut
    Oui elle teste le cas de la chaîne vide.
    Et de toute façon dans la ligne qui plante je lui passe une String dont la valeur est "username".
    Et non, mon attribut login n'est pas déclaré transient.
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

  6. #6
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Zut, quel nul je fais : je n'avais pas lu tout jusqu'au bout. Est-ce que tu es sûr que tu retrouves bien ton utilisateur ?
    Je viens de voir que tu le crées, puis que tu le charges, mais que s'il n'y a pas de résultat tu crées un nouvel utilisateur qui est donc vide. À ce niveau là, tu devrais tester que l'utilisateur a bien été retrouvé, c'est probablement de là que vient le souci.

  7. #7
    Membre éclairé
    Avatar de natoine
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Décembre 2007
    Messages
    393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 393
    Par défaut
    Et j'ai résolu mon problème.
    Effectivement je récupérais un utilisateur new et pas un en base.
    Parce que il n'était pas créé.
    Le problème est que j'utilisais une adresse mail non valide et que ma méthode createUser vérifie que le mail soit valide.

    Le boulet !!!

    Merci quand même pour ton aide
    www.natoine.fr
    natoine.developpez.com
    Principalement du Java avec un soupçon de réseaux sociaux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur "not-null property references a null or transient value"
    Par mactar85 dans le forum Frameworks Web
    Réponses: 2
    Dernier message: 14/08/2013, 09h06
  2. Réponses: 5
    Dernier message: 30/12/2010, 11h46
  3. Réponses: 6
    Dernier message: 29/11/2010, 16h09
  4. 'numeric or value error: number precision too large'
    Par sami117 dans le forum PL/SQL
    Réponses: 1
    Dernier message: 12/01/2009, 15h57
  5. Différence Null, VbNull, DBNull.Value
    Par nikles007 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 22/09/2008, 18h08

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