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

151

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 ça?

@Entity
public class Person {

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

    @OneToMany(mappedBy="person", cascade=CascadeType.ALL)
    private List<Address> addresses;
}

@Entity
public class Address {

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

    @ManyToOne
    @JoinColumn(name="ADDRESS_FK")
    @Column(insertable=false, updatable=false)
    private Person person;
}
Thang Pham
la source

Réponses:

121

Vous feriez cela lorsque la responsabilité de créer / mettre à jour l'entité associée en question n'est pas dans l' entité actuelle . Par exemple, vous avez un Personet un Address. Vous souhaitez ajouter insertable=false, updatable=falseà la @OneToManyrelation avec l' Personentité dans l' Addressentité, simplement parce qu'il n'est pas de la responsabilité de l' Addressentité de créer ou de mettre à jour un fichier Person. C'est l'inverse.

BalusC
la source
Il fait référence à la définition insertable=false,updatable=falsede l'un des côtés de la relation.
BalusC
3
Vous dites qu'avec updatable = false on 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). Vous dites également que la définition @Column fait quelque chose de différent lorsque sa clé étrangère (Person) et quand ce n'est pas une clé étrangère (car il n'y a pas d'entité référencée pour désactiver la mise à jour). En lisant javadoc pour actualisable, je dirais qu'il sera simplement désactivé pour changer la personne pour une adresse donnée si elle est une fois persistée. Pouvez-vous expliquer s'il vous plaît?
Flowy
8
Je pense que tu voulais dire ... to the @ManyToOne relationship with the ...??
Martin Konecny
112

La définition insertable=false, updatable=falseest utile lorsque vous devez mapper un champ plusieurs fois dans une entité, généralement:

Ce n'est pas une chose sémantique de l'OMI, mais certainement technique.

Pascal Thivent
la source
15
Je crois fermement que cette réponse est bien meilleure que celle acceptée. La réponse acceptée exprime le sentiment que l'attribut insérable / actualisable 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 / la mise à jour de la colonne dans l'entité actuelle. La création / mise à jour de l'entité associée est abordée par l'attribut cascade de l'annotation de mappage.
Jayant
26

Je voudrais ajouter aux réponses de BalusC et Pascal Thivent une autre utilisation courante de insertable=false, updatable=false:

Considérez une colonne qui n'est pas un identifiant mais une sorte de numéro de séquence . La responsabilité du calcul du numéro de séquence n'appartient pas nécessairement à l'application.

Par exemple, le numéro de séquence commence par 1000 et doit être incrémenté de un pour chaque nouvelle entité. Cela se fait facilement et de manière très appropriée dans la base de données, et dans de tels cas, ces configurations ont du sens.

Magnilex
la source
1
Les séquences sont également prises en charge par JPA, vous pouvez donc définir votre séquence avec des annotations JPA également.
eis
9

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

Johny19
la source
Hibernate est-il censé bloquer les mises à jour en fonction d'une annotation actualisable = fausse? Dans mon test de référentiel JPA, une colonne created_on avec cette annotation accepte les mises à jour sans plainte.
chrisinmtown
2
@chrisinmtown Eclipselink n'inclura pas du tout la colonne dans le sql. Je pense que c'est la même chose avec Hibernate
Jaqen H'ghar