Problème hibernate one-to-many / many-to-one
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:
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/SETTER |
Code:
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 |
Mon 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.
Mainenant mon code qui pose problème :
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
|
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(); |
Tout se passe bien au niveau de la création du département et de mes 2 employés.
C'est ensuite que cela se gatte:(....je souhaite supprimer un employé et en rajouter un nouveau.
Problème:mrgreen:, 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: 8Opourquoi ???
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....