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;
}
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.
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.
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.
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