web-dev-qa-db-fra.com

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 ç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;
}
127
Thang Pham

Vous le feriez si la responsabilité de créer/mettre à jour l'entité associée en question ne figurait pas dans l'entité actuelle . Par exemple. vous avez un Person et un Address. Vous souhaitez ajouter insertable=false, updatable=false à la @OneToMany relation avec l'entité Person dans l'entité Address, tout simplement parce que l'entité Address n'a pas la responsabilité de créer ou de mettre à jour un Person. C'est l'inverse.

105
BalusC

Définir insertable=false, updatable=false est utile lorsque vous devez mapper plusieurs fois un champ dans une entité, généralement:

Ceci n’est pas une affaire sémantique, mais bien technique.

93
Pascal Thivent

Je voudrais ajouter aux réponses de BalusC et de 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 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 tout à fait appropriée, dans la base de données, et dans de tels cas, ces configurations ont un sens.

19
Magnilex

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

7
Johny19