Bonjour,
Je souhaite créer une petite application permettant de faire un CRUD (Create/Read/Update/Delete) sur un objet (User)
Donc j'ai une relation OneToMany et ManyToOne entre deux entités
########## USERS
########## AUTHORITIES
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 @Entity @Table(name = "users") public class Users implements Serializable { @Id @Column(name = "username") private String username; @Column(name = "password") private String password; @Column(name = "enabled") private Boolean enabled; @Column(name = "email") private String email; @OneToMany(cascade = CascadeType.ALL) private List<Authorities> authoritiesList;
########## DAO
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 @Entity @Table(name = "authorities") public class Authorities implements Serializable { @EmbeddedId protected AuthoritiesPK authoritiesPK; @ManyToOne @JoinColumn(name = "username", insertable = false, updatable = false) private Users users;
##########Utilisation de PRIMEFACES
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
48
49
50
51
52
53 public Users addUser(Users pUser, List<String> pListAuthorities) { EntityTransaction tx = getEM().getTransaction(); tx.begin(); getEM().persist(pUser); for (String authoritie : pListAuthorities) { AuthoritiesPK authoritiesPK = new AuthoritiesPK(pUser.getUsername(), authoritie); Authorities authorities = new Authorities(authoritiesPK); authorities.setUsers(pUser); getEM().persist(authorities); } tx.commit(); return pUser; } public Users modifyUser(Users pUser) { EntityTransaction tx = getEM().getTransaction(); tx.begin(); pUser = getEM().merge(pUser); tx.commit(); return pUser; } public void deleteUser(Users pUser) { EntityTransaction tx = getEM().getTransaction(); if (pUser.getAuthoritiesList() != null) { tx.begin(); List<Authorities> authoritieses = pUser.getAuthoritiesList(); for (Authorities a : authoritieses) { a.setUsers(null); } pUser.getAuthoritiesList().clear(); pUser = getEM().merge(pUser); tx.commit(); } tx.begin(); getEM().remove(pUser); tx.commit(); } protected EntityManager getEM() { if (em == null) { em = Persistence.createEntityManagerFactory( JPA_UNIT_NAME).createEntityManager(); } return em; }
Je possède un convertisseur sur ma liste
########## DIALOG USERS EDIT
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 @FacesConverter("authoritiesConverter") public class AuthoritiesConverter implements Converter { private static final List<Authorities> LIST_AUTHORITIES; static { ArrayList<Authorities> tmp = new ArrayList<Authorities>(); tmp.add(new Authorities("", "admin")); tmp.add(new Authorities("", "extended")); tmp.add(new Authorities("", "visitor")); LIST_AUTHORITIES = Collections.unmodifiableList(tmp); } @Override public Object getAsObject(FacesContext fc, UIComponent uic, String string) { for (Authorities authorities : LIST_AUTHORITIES) { if (authorities.getAuthoritiesPK().getAuthority().equals(string)) { return authorities; } } return null; } @Override public String getAsString(FacesContext fc, UIComponent uic, Object o) { return ((Authorities) o).getAuthoritiesPK().getAuthority(); }
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 <p:dialog header="Edit User" widgetVar="userEditDialog" resizable="false" id="userEditDlg" showEffect="fade" hideEffect="explode" modal="true" appendTo="@(body)" styleClass="dlg"> <h:form id="editForm"> <p:panelGrid id="userEditDisplay" columns="2" styleClass="dlgPanelGroup"> <h:panelGroup> <p:panelGrid columns="2" styleClass="dlgPanelGrid"> <p:outputLabel value="Username : " styleClass="dlgLabel"/> <p:outputLabel value="#{userController.selectedUser.username}" styleClass="dlgLabelView"/> <p:outputLabel value="Password : " style="font-weight:bold" styleClass="dlgLabel"/> <p:inputText value="#{userController.selectedUser.password}" required="true"/> <p:outputLabel value="Email :" styleClass="dlgLabel"/> <p:inputText value="#{userController.selectedUser.email}"/> <p:outputLabel value="Enabled : " styleClass="dlgLabel"/> <p:selectBooleanCheckbox value="#{userController.selectedUser.enabled}"/> </p:panelGrid> </h:panelGroup> <h:panelGroup> <p:panelGrid columns="2" styleClass="dlgPanelGrid"> <p:outputLabel value="Authorities : " styleClass="dlgLabel"/> <p:selectManyCheckbox value="#{userController.selectedUser.authoritiesList}" layout="pageDirection" converter="authoritiesConverter"> <f:attribute name="collectionType" value="java.util.ArrayList" /> <f:selectItems value="#{userController.listAuthorities}"/> </p:selectManyCheckbox> </p:panelGrid> </h:panelGroup> </p:panelGrid> <div align="right"> <p:commandButton value="Cancel" type="button" onclick="userEditDialog.hide()" style="margin-top:10px;" icon="ui-icon-close" styleClass="buttonCancel"/> <p:commandButton id="editBtn" value="Save" oncomplete="userEditDialog.hide()" action="#{userController.save()}" styleClass="buttonSave" ajax="false" style="margin-top:10px;" icon="ui-icon-disk" update=":usersForm:users"/> </div> </h:form> </p:dialog>
J’arrive à ajouter un objet, mais j’ai des problèmes lors de l’ajout ou de la modification d’un objet user
TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: entity.Authorities.users -> entity.Users
ServletException: could not initialize a collection: [entity.Users.authoritiesList#
MERCI DE VOTRE AIDE
Partager