Combobox - FK qui ne s'update pas
Bonjour à tous,
Ça fait un moment que je suis devant ce problème, j'ai beau le tourner dans tous les sens, je ne vois pas la solution :
Je suis junior en Java et je suis en train d'apprendre javaFX. J'utilise Netbeans, dernière version, avec EclipseLink, java DB, du jpa et SceneBuilder.
J'ai une classe "Entreprise" qui a un seul moyen de transport, et une classe "Transport" qui concerne plusieurs entreprises.
La classe Entreprise :
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| private IntegerProperty idEntreprise = new SimpleIntegerProperty();
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ID_ENTREPRISE", nullable = false)
public Integer getIdEntreprise(){
return idEntreprise.get();
}
public void setIdEntreprise(Integer value){
idEntreprise.set(value);
}
public IntegerProperty idEntrepriseProperty(){
return idEntreprise;
}
[...]
//ASSOCIATION ENTREPRISE - TRANSPORT
private ObjectProperty<Transport> oneTransport = new SimpleObjectProperty();
@ManyToOne (cascade=CascadeType.PERSIST)
@JoinColumn(name="ONETRANSPORT_ID_TRANSPORT", referencedColumnName="ID_TRANSPORT")
public Transport getOneTransport(){
return oneTransport.get();
}
public void setOneTransport(Transport value){
oneTransport.set(value);
}
public ObjectProperty<Transport> oneTransportProperty(){
return oneTransport;
}
[...]
@Override
public void writeExternal(ObjectOutput out) throws IOException {
[...]
out.writeObject(getOneTransport());
[...]
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
[...]
setOneTransport((Transport)in.readObject());
[...]
}
//Les constructeurs [...] |
La classe Transport :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
//Je ne laisse que le passage OneToMany, puisque le principe, pour le reste, est le même que pour Entreprise
private ObservableList<Entreprise> colEntreprise = FXCollections.observableArrayList();
// @Access(AccessType.PROPERTY)
@OneToMany(mappedBy = "oneTransport",cascade = CascadeType.ALL)
public List<Entreprise> getColEntreprise(){
return colEntreprise;
}
public void setColEntreprise(final List<Entreprise> colEntreprise){
this.colEntreprise.setAll(colEntreprise);
}
public ListProperty colEntrepriseProperty(){
return (ListProperty) colEntreprise;
} |
Quand j'affiche l'entreprise, tout s'affiche correctement. Le problème arrive quand je veux éditer une entreprise pour y changer le moyen de transport. Voici ce que j'ai dans le controller :
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 33 34 35 36 37 38
|
[...]
@FXML
private ComboBox<Transport> transportCBox;
ObservableList<Transport> transportData = FXCollections.observableArrayList();
@Override
public void initialize(URL location, ResourceBundle resources) {
transportCBox.setItems(transportData);
fillTransport();
}
@FXML
void doneBtnClick(ActionEvent event) {
if (!editMode){
e = new Entreprise();
}
[...]
e.setOneTransport(transportCBox.getValue());
em.getTransaction().begin();
em.persist(e);
em.getTransaction().commit();
em.close();
cancelBtnClick();
}
public void fillTransport(){
em = JobSeeker.emf.createEntityManager();
List<Transport> lst = em.createQuery("Select t from Transport t").getResultList();
for (Transport t : lst){
transportData.add(new Transport(t.getIdTransport(),t.getNomTransport()));
}
em.close();
} |
Enfin, au cas où, voici le code de la BDD :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
create table "ENTREPRISE"
(
"ID_ENTREPRISE" INT not null primary key GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
"NOM_ENTREPRISE" VARCHAR(50) NOT NULL,
[...]
"ONETRANSPORT_ID_TRANSPORT" INT NOT NULL,
[...]
FOREIGN KEY (ONETRANSPORT_ID_TRANSPORT) REFERENCES TRANSPORT (ID_TRANSPORT)
)
create table "TRANSPORT"
(
"ID_TRANSPORT" INT not null primary key GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
"NOM_TRANSPORT" VARCHAR(20)
) |
Le problème rencontré : quand j'édite l'entreprise et que j'y modifie le moyen de transport, donc, d'une part la foreign key n'est pas modifiée, à la place une nouvelle entreprise est créée avec le nouveau transport, et d'autre part, un nouveau nom_transport est ajouté dans la table du même nom.
Je n'ai pas encore entré de règle d'unicité, je comptais le faire ensuite, de plus, il est possible que ça et là, les règles de nommage ne soient pas respectées mais je n'ai pas l'impression que le problème vient de là. Je ne suis même pas sûre que le souci vienne de la couche javaFX, c'est très probablement plus du côté du jpa que ça coince. S'il manque des informations, n'hésitez pas à me le signaler.
Si quelqu'un a la solution, je suis bien évidemment preneuse, dans tous les cas merci de m'avoir lue.