8 votes

Hibernate - Comment faire persister uniquement le parent, en gardant les enfants tels qu'ils sont

Quelqu'un peut-il m'aider à comprendre comment configurer Hibernate pour faire ce que je veux ?

J'ai une entité parent "Appartement" avec une liste de "Pièces" comme enfants. J'ai un formulaire pour éditer les "Appartements" et dans ce formulaire, j'ai listé tous les "Pièces" enfants, juste à titre d'information. Les chambres sont ajoutées et modifiées dans un formulaire séparé.

Donc, parce que je liste les chambres dans le formulaire appartement, j'ai mis lazyloading à false :

    @OneToMany
@JoinColumn (name = "appartmentId")
@LazyCollection (LazyCollectionOption.FALSE)
private List<Room> room;

Mais si je modifie un appartement et le stocke, toutes les pièces de l'appartement disparaissent soudainement. Dans la base de données, elles ne sont pas supprimées, mais déréférencées (comme dans appartmentId = null).

Alors, comment puis-je configurer Hibernate pour qu'il ne fasse que persister mon Appartment-objet. Et ne pas toucher aux enfants du tout ?

C'est mon action de sauvegarde :

public String save() throws Exception {
    boolean isNew = (appartment.getAppartmentId() == null);

    appartment = appartmentManager.save(appartment);

    String key = (isNew) ? "appartment.added" : "appartment.updated";
    saveMessage(getText(key));

    return SUCCESS;
}

11voto

Erik Dahl Points 126

C'est très simple. Il n'est pas nécessaire de repeupler vos enfants, ni de créer des DTO distinctes.

Si vous n'avez pas l'intention de conserver les enfants, ajoutez simplement insertable=false, updatable=false à votre annotation joincolumn. Comme ceci :

@OneToMany
@JoinColumn (name = "appartmentId", insertable = false, updatable = false)
@Fetch(value = FetchMode.JOIN)
private List<Room> room;

1voto

Ryan Stewart Points 46960
  1. Ne désactivez pas la recherche paresseuse dans un mappage. Utilisez stratégies d'extraction pour l'optimisation des performances.
  2. Hibernate ne supprimera les pièces d'un appartement que si vous lui demandez de sauvegarder/mettre à jour un appartement qui ne contient aucune pièce.

-2voto

ctapobep Points 1628

Au lieu d'utiliser des entités persistantes, envisagez d'utiliser des DTO (vous pouvez les appeler modèle de page dans le cas de pages Web). Ils peuvent vous donner une certaine souplesse pour représenter les informations que vous souhaitez et les afficher dans le format que vous voulez. Mais vous devez payer pour cela - vous ajoutez de nouvelles classes à votre système et vous devez trouver un moyen de transformer les entités en DTO et inversement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X