Problème modification clé primaire/étrangère (En cascade)
Bonjour,
Voilà je suis actuellement entrain de faire un projet avec hibernate en java.
Mon application est connecté à une base de donnée où j’ai deux tables.
Une table Medicament, qui contient différentes informations sur mes médicaments.
Ainsi qu’une table Famille qui correspond à la famille de médicaments.
Autrement dit, chaque médicament appartient à une et une seule famille. Et chaque famille contient 0 à plusieurs médicaments.
Mon application a donc pour but de pouvoir modifier les différentes familles et les différentes médicaments.
Seulement quand je modifie la clé primaire de ma famille qui correspond donc à une clé étrangère dans mon médicament. Cela me met cette erreur :
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
|
2353 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
java.lang.NullPointerException
at net.gui.AjoutFamille$3.widgetSelected(AjoutFamille.java:174)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4169)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3758)
at net.gui.AjoutFamille.open(AjoutFamille.java:78)
at net.gui.ListObjets$2.widgetSelected(ListObjets.java:174)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4169)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3758)
at net.gui.ListObjets.open(ListObjets.java:108)
at net.gui.PageAccueil$12.linkActivated(PageAccueil.java:576)
at org.eclipse.ui.forms.widgets.AbstractHyperlink.handleActivate(AbstractHyperlink.java:233)
at org.eclipse.ui.forms.widgets.ImageHyperlink.handleActivate(ImageHyperlink.java:199)
at org.eclipse.ui.forms.widgets.AbstractHyperlink.handleMouseUp(AbstractHyperlink.java:327)
at org.eclipse.ui.forms.widgets.AbstractHyperlink.access$2(AbstractHyperlink.java:311)
at org.eclipse.ui.forms.widgets.AbstractHyperlink$4.handleEvent(AbstractHyperlink.java:125)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4169)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3758)
at net.gui.PageAccueil$1.run(PageAccueil.java:72)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
at net.gui.PageAccueil.open(PageAccueil.java:63)
at net.gui.PageAccueil.main(PageAccueil.java:52) |
Et voici une partie de code de mes models Famille et medicament :
Médicament :
Code:
1 2 3 4 5 6 7 8 9 10 11
| @ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "famCode", nullable = false)
public Famille getFamille() {
return this.famille;
}
public void setFamille(Famille famille) {
Famille oldValue = this.famille;
this.famille = famille;
firePropertyChange("famille", oldValue, famille);
} |
Famille :
Code:
1 2 3 4 5 6 7 8
| @OneToMany(fetch = FetchType.LAZY, mappedBy = "famille", cascade = { CascadeType.ALL }, orphanRemoval = true)
public Set<Medicament> getMedicaments() {
return this.medicaments;
}
public void setMedicaments(Set<Medicament> medicaments) {
this.medicaments = medicaments;
} |
Et voici le code quand je modifie ma famille :
Code:
1 2 3 4 5 6 7
| Transaction transaction = session.beginTransaction();
Famille maFamille = (Famille) session.get(Famille.class,
fam.getFamCode());
maFamille.setFamCode(textCodeFamille.getText());
maFamille.setFamLibelle(textLibelleFamille.getText());
transaction.commit();
session.update(maFamille); |
Je voudrais donc que quand je modifie la clé primaire de famille ca la modifie pour tous les médicaments. Je penses donc qu’il y a un problème dans l’update den cascade mais je ne sais pas comment résoudre le problème, c’est pour cela que je viens vers vous.
Merci d'avance,