188 votes

Veuillez expliquer à propos de insertable=false et updatable=false en référence à l'annotation JPA @Column

Si un champ est annoté insertable=false, updatable=false, cela ne signifie-t-il pas que vous ne pouvez pas insérer de valeur ni modifier la valeur existante ? Pourquoi voudriez-vous faire cela ?

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy="person", cascade=CascadeType.ALL)
    private List

147voto

BalusC Points 498232

Vous feriez cela lorsque la responsabilité de créer / mettre à jour l'entité de colonne référencée n'est pas dans l'entité actuelle, mais dans une autre entité.

4 votes

Vous dites qu'avec updatable=false sur Person, cela désactivera la mise à jour de Person.name lors de la mise à jour de l'adresse (je ne suis pas d'accord car c'est le but de la cascade). De plus, vous dites que la définition @Column fait quelque chose de différent lorsqu'il s'agit de clé étrangère (Person) et lorsqu'il ne s'agit pas de clé étrangère (comme il n'y a pas d'entité référencée à désactiver la mise à jour). En lisant la javadoc pour updatable, je dirais que cela désactivera simplement le changement de Person pour une adresse donnée une fois persistée. Pouvez-vous expliquer s'il vous plaît?

1 votes

N'est-ce pas déjà suffisamment défini par les options de cascade ? J'ai vu cela être utilisé pour ne pas rencontrer de problèmes en essayant d'écrire dans une colonne générée. (par exemple, une colonne de volume GENERATED ALWAYS AS (hauteur * largeur * longueur) VIRTUAL)

140voto

Pascal Thivent Points 295221

Définir insertable=false, updatable=false est utile lorsque vous avez besoin de mapper un champ plus d'une fois dans une entité, typiquement :

Ce n'est, à mon avis, pas une question sémantique, mais certainement technique.

27 votes

Je crois fermement que cette réponse est bien meilleure que celle acceptée. La réponse acceptée donne l’impression que l’attribut insérable/modifiable a à voir avec la création/mise à jour de l'entité associée, alors que l’intention réelle derrière ces attributs est d’empêcher l’insertion/mise à jour de la colonne dans l'entité actuelle. La création/mise à jour de l'entité associée est gérée par l'attribut cascade de l'annotation de mappage.

32voto

Magnilex Points 1671

Je voudrais ajouter aux réponses de BalusC et Pascal Thivent un autre usage courant de insertable=false, updatable=false:

Considérons une colonne qui n'est pas un id mais une sorte de numéro de séquence. La responsabilité du calcul du numéro de séquence peut ne pas nécessairement appartenir à l'application.

Par exemple, le numéro de séquence commence par 1000 et devrait augmenter de un pour chaque nouvelle entité. Cela se fait facilement, et très judicieusement, dans la base de données, et dans de tels cas ces configurations ont du sens.

2 votes

Les séquences sont également prises en charge par JPA, vous pouvez donc définir votre séquence avec des annotations JPA, aussi.

24voto

Johny19 Points 1611

Un autre exemple serait sur la colonne "created_on" où vous voulez laisser la base de données gérer la date de création

6voto

Josh Points 11

Je pense que cela signifie simplement :

boolean insertable

(Facultatif) Indique si la colonne est incluse dans les instructions SQL INSERT générées par le fournisseur de persistance.

boolean updatable

(Facultatif) Indique si la colonne est incluse dans les instructions SQL UPDATE générées par le fournisseur de persistance.

Référence : https://www.objectdb.com/api/java/jpa/Column

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