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

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;
########## AUTHORITIES

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;
########## 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
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;
    }
##########Utilisation de PRIMEFACES

Je possède un convertisseur sur ma liste

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();
    }
########## 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
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 