Salut à tous,

Je débute en java-EJB3 et j’ai un souci d’implémentation pour la gestion des autorisations. Un user a un role. Un rôle a plusieurs profiles : User[1]-> [1-*] Role [1] -> [1-*]Profil
J’ai donc les classes suivantes :
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
54
55
56
57
58
59
60
@Entity
@Name("user")
@Scope(SESSION)
public class User implements Serializable {
private Long id;
private String firstname;
private String lastname;
private boolean enabled;
private List<Role> roles;
 
@Id
@GeneratedValue
@Column(name="USER_ID")
public Long getId() {
return id;
}
 
public void setId(Long userId) {
this.id = userId;
}
 
@Column(name="USER_FIRSTNAME")
public String getFirstname() {
return firstname;
}
 
public void setFirstname(String firstname) {
this.firstname = firstname;
}
 
@Column(name="USER_LASTNAME")
public String getLastname() {
return lastname;
}
 
public void setLastname(String lastname) {
this.lastname = lastname;
}
 
@Column(name="USER_ENABLED")
public boolean isEnabled() {
return enabled;
}
 
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
 
@ManyToMany(targetEntity = Role.class)
@JoinTable( name = "AUTHORIZATION_RULES",
joinColumns = @JoinColumn(name = "USER_ID"),
inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
public List<Role> getRoles() {
return roles;
}
 
public void setRoles(List<Role> roles) {
this.roles = roles;
}
}
Les Roles :

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
54
55
56
57
58
59
60
61
62
63
64
65
66
@Entity
public class Role implements Serializable {
 
private Long id;
private String rolename;
private boolean conditional;
private List<Profil> profils;
private List<User> users;
 
private List<Profil> authorizedProfiles;
 
@Id
@GeneratedValue
@Column(name="ROLE_ID")
public Long getId() {
return id;
}
 
public void setId(Long roleId) {
this.id = roleId;
}
 
public String getRolename() {
return rolename;
}
 
public void setRolename(String rolename) {
this.rolename = rolename;
}
 
public boolean isConditional() {
return conditional;
}
 
public void setConditional(boolean conditional) {
this.conditional = conditional;
}
 
@ManyToMany(mappedBy="roles")
@JoinTable( name = "AUTHORIZATION_RULES",
joinColumns = @JoinColumn(name = "ROLE_ID"),
inverseJoinColumns = @JoinColumn(name = "USER_ID"))
public List<User> getUsers() {
return users;
}
 
public void setUsers(List<User> users) {
this.users = users;
}
 
/**
* Relation entre les users, les roles et les profiles
* @return
*/
@ManyToMany(targetEntity = Profil.class)
@JoinTable( name = "AUTHORIZATION_RULES",
joinColumns = @JoinColumn(name = "ROLE_ID"),
inverseJoinColumns = @JoinColumn(name = "PROFIL_ID"))
public List<Profil> getProfils() {
return profils;
}
 
public void setProfils(List<Profil> profils) {
this.profils = profils;
}
}
Les profiles :

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
@Entity
public class Profil implements Serializable {
private Long id;
private String profilName;
private List<Role> roles;
 
@ManyToMany(targetEntity=Role.class)
@JoinTable( name = "AUTHORIZATION_RULES",
joinColumns = @JoinColumn(name = "PROFIL_ID"),
inverseJoinColumns = @JoinColumn(name = "ROLE_ID"))
public List<Role> getRoles() {
return roles;
}
 
public void setRoles(List<Role> roles) {
this.roles = roles;
}
 
@Id
@GeneratedValue
@Column(name="PROFIL_ID")
public Long getId() {
return id;
}
 
public void setId(Long id) {
this.id = id;
}
 
@Length(max = 20)
public String getProfilName() {
return profilName;
}
 
public void setProfilName(String name) {
this.profilName = name;
}
}
Dans le session bean, je fais l’update suivant :

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
public void update(User user) {
Long idUser=user.getId();
//Mise à jour des Roles/Profils : annule et remplace
String sqlQuery = "DELETE FROM AUTHORIZATION_RULES WHERE USER_ID = ?1";
Query deleteQuery = entityManager.createNativeQuery(sqlQuery)
.setParameter(1, user.getId());
 
int nbUpdate = deleteQuery.executeUpdate();
 
sqlQuery = "INSERT INTO AUTHORIZATION_RULES (user_id,role_Id,profil_Id) VALUES (?1,?2,?3)";
List<Role>roles = user.getRoles();
for (Role role : roles) {
  Long idRole=role.getId();
  List<Profil>profils = role.getProfils();
  for (Profil profil : profils) {
    Long idProfil=profil.getId();
    Query insertQuery = entityManager.createNativeQuery(sqlQuery)
    .setParameter(1, idUser)
    .setParameter(2, idRole)
    .setParameter(3, idProfil);
 
    nbUpdate = insertQuery.executeUpdate();
  }
}
entityManager.merge(user);
}
Quand j’execute cette méthode, j’ai l’erreur suivante :

22:31:54,968 WARN [JDBCExceptionReporter] SQL Error: 1364, SQLState: HY000
22:31:54,968 ERROR [JDBCExceptionReporter] Field 'PROFIL_ID' doesn't have a default value
22:31:54,968 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update

Caused by: java.sql.BatchUpdateException: Field 'PROFIL_ID' doesn't have a default value
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1213)

22:31:54,984 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator_2] TwoPhaseCoordinator.beforeCompletion - failed for com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple@1bb4422
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
Est-ce que vous avez une idée ?