Bonjour,
J'ai un problème avec une relation bidirectionelle one-to-many many-to-one que je ne comprends pas....je trouve des exemples sur internet mais rien de très précis en terme d'explication.
Mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 @Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "department", orphanRemoval = false) private List<Employee> employees = new ArrayList<Employee>(); // GETTER/SETTERMon mapping est comme celui car le schéma de la base de données ne peut être modifié et il n'y a pas de table d'association/liaison entre ces 2 tables.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 @Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; @ManyToOne @JoinColumn(name="DEPARTMENT_ID", nullable = true) private Department department; // GETTER/SETTER
Mainenant mon code qui pose problème :
Tout se passe bien au niveau de la création du département et de mes 2 employés.
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 Department department = new Department("DEPARTMENT 1"); department.getEmployees().add(new Employee("Pierre", department)); department.getEmployees().add(new Employee("Jean", department)); // Création du département et de 2 employés Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); department=(Department)session.merge(department); tx.commit(); HibernateUtil.closeSession(); department.getEmployees().remove(0); department.getEmployees().add(new Employee("Tito", department)); session = HibernateUtil.currentSession(); tx = session.beginTransaction(); session.merge(department); tx.commit(); HibernateUtil.closeSession();
C'est ensuite que cela se gatte....je souhaite supprimer un employé et en rajouter un nouveau.
Problème, il rajoute bien le nouveau employé, donc le département a maintenant 3 employé mais moi, je souhaiterais qu'il en est que 2, car le premier a été supprimé.
Je vois que dans les requêtes SQL généré, il ne fait rien pour supprimer l'employé d'index 0 dans ma liste du département: pourquoi ???
Par contre, si je mets orphanRemoval = true, cela corrige mon problème mais il a supprimé totalement mon employé d'index 0, alors que je souhaite simplement détruire la relation de l'employé d'index 0, qu'il n'appartienne plus à aucun département mais qu'il soit présent en base de donnés...c'est un peu pour ça que j'ai mis nullable = true sur la proprièté Department de l'entité Employee et orphanRemoval = false; au départ pour lui indiquer que j'accepte les orphelins.
Merci d'avance de vos lumières, conseils....
Partager