8773 sujets

Développement web côté serveur, CMS

Bonjour.
Dans une appli web, j'utilise une base JavaDB et les EJB pour les entités.
J'ai une table mère et une table fille définies comme ça :

La table mère :
@Entity
@Table(name = "RefUtilisateur")
public class RefUtilisateur implements Serializable {

@OneToMany(cascade = CascadeType.REMOVE, mappedBy = "refUtilisateur")
    private List<UtiHistorique> listeUtiHistorique;

@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int idPk;

La table fille :
@Entity
@Table(name = "UtiHistorique")
public class UtiHistorique implements Serializable {
    
    @ManyToOne
    @JoinColumn(name = "REFUTILISATEURFK", referencedColumnName = "IDPK", insertable = false, updatable = false, nullable = false)
    private RefUtilisateur refUtilisateur;

@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int idPk;
    private int refUtilisateurFk;

Lorsqu'une ligne fille est insérée dans la base, je souhaiterais synchroniser la liste fille (liste OneToMany de la mère) pour obtenir le même nombre de lignes que dans la base.
Peut-on faire ça ?
MERCI.
Modifié par denisduval75 (13 Jan 2025 - 10:15)
Bonsoir,

Dans ton entité UtiHistorique, tu as spécifié insertable=false, updatable=false.
Ca signifie que ta référence arrière n'est ni utilisée pour créer des données dans la base, ni pour les mettre à jour.
Ca signifie du même coup que c'est nécessairement l'entité RefUtilisateur qui est propriétaire de ses filles, et que tu dois passer par la liste pour en ajouter/supprimer. C'est quand tu persistes un RefUtilisateur que ses UtiHistorique sont créés ou mis à jour.

Si tu veux faire l'inverse, commence par enlever insertable=false et updatable=false. Peut-être qu'il faut aussi ajouter inverse=true un des deux côtés pour bien préciser dans quel sens ça doit être géré. J'ai un doute, à vérifier dans la doc d'Hibernate/JPA/etc.

Cela dit, je ne suis pas certain que les listes sont mises à jour automatiquement sans rechargement de l'entité parente, même en paramétrant que la fille est propriétaire. En cas de doute et en principe dans une relation bidirectionnelle, c'est à toi de toujours t'arranger pour que les données soient correctes des deux côtés. Le plus souvent, c'est au moment où on ajoute une fille dans la liste qu'elle est directement persistée, et pareil pour la suppression, pour ce que j'en sais.

Note à part: il est généralement conseillé d'utiliser un Set plutôt qu'une List, sauf si l'ordre a une importance.
Bonjour.
Merci pour les infos.
Pour commencer j'ai mis à true insertable et updatable de UtiHistorique
Mais j'ai l'erreur suivante :
Avez-vous une idée ?
Merci.

Exception [EclipseLink-48] (Eclipse Persistence Services - 2.6.1.v20150605-31e8258): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [UtiHistorique.REFUTILISATEURFK]. Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.ManyToOneMapping[refUtilisateur]
Descriptor: RelationalDescriptor(entity.UtiHistorique --> [DatabaseTable(UtiHistorique)])