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 :
Le code est le suivant :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)
CommentsControl :
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
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(); } }
Le code de test :
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(); } }
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]"); }
Partager