Bonjour à tous,
Voila j'ai un problème avec les transactions avec hibernate car celles-ci ne veulent pas opérer de rollback.
Je m'explique : j'ai crée une class User avec hibernate annotations et j'ai creer une class de test pour me permettre d'ajouter des utilisateurs dans ma base de donnée MySQL.
Le problème c'est que quand un utilisateur est déja présent dans ma base de donnée, je voudrais que la transaction soit 'annulée' c'est à dire que la base soit revenu en son état initiale avant l'insertion.
Voici le code de la classe User :
Code:
@Entity
@Table(name = "USERS")
public class User {
@Id
@GeneratedValue
@Column(name = "USER_ID")
private Long id;
@Column(name = "LOGIN", nullable = false, unique = true)
private String login;
@Column(name = "PASS", nullable = false)
private String pass;
@ManyToMany(targetEntity = com.calenco.users.Role.class, cascade = {
CascadeType.PERSIST, CascadeType.MERGE })
@JoinTable(name = "USER_ROLE", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
private Collection<Role> roles = new ArrayList<Role>();
@Column(name = "MAIL", nullable = false)
private String mail;
/**
* Creates a new instance of Users
*/
public User() {
}
public User(String login, String pass, String mail, Collection<Role> role) {
super();
this.login = login;
this.pass = pass;
this.roles = role;
this.mail = mail;
}
public Long getId() {
return id;
}
@SuppressWarnings("unused")
private void setId(Long id) {
this.id = id;
}
public String getLogin() {
return login;
}
public String getPass() {
return pass;
}
public void setLogin(String login) {
this.login = login;
}
public String getMail() {
return mail;
}
public Collection<Role> getRoles() {
return roles;
}
public void setMail(String mail) {
this.mail = mail;
}
public void setPass(String pass) {
this.pass = pass;
}
public void setRoles(Collection<Role> roles) {
this.roles = roles;
}
public void addRole(Role role) {
roles.add(role);
}
}
Voici le code d'ajout des utilisateurs :
Code:
public void addUser(User user) throws UserExistsException {
if (userExists(user)) {
throw new UserExistsException("Users already exists");
} else {
Session session = HibernateUtils.getSession();
Transaction transact = session.beginTransaction();
session.save(user);
System.out.println("User added : " + user.getLogin());
transact.commit();
session.close();
}
}
public boolean addUsers(List<User> users) throws UserExistsException {
Session session = HibernateUtils.getSession();
Transaction transact = null;
boolean retVal = true;
try {
transact = session.beginTransaction();
for (int i = 0; i < users.size(); i++) {
System.out.println("Trying to add user " + i);
addUser(users.get(i));
}
transact.commit();
} catch (UserExistsException e) {
if (transact != null)
transact.rollback();
retVal = false;
throw e;
} finally {
session.close();
}
return retVal;
}
J'aimerais donc savoir pourquoi ma transaction n'effectue pas de rollback. Si il y'a une autre méthode ou alors une autre facon de faire je serais heureux de pouvoir la connaitre.
Merci pour vos reponses.