HIbernate OneToMany / ManyToOne CRUD Object
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:
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:
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:
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:
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:
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