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

3voto

Nimit Agrawal Points 11

Selon la documentation de persistence de Javax :

insertable:

public abstract boolean insertable

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

updatable:

public abstract boolean updatable

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

Il serait préférable de se référer à la documentation officielle.

2voto

ihebiheb Points 306

Une autre raison pourrait être que votre attribut est mappé à une colonne d'une vue (par exemple, votre entité hibernate est la fusion d'une table et d'une vue). Il n'a donc aucun sens que votre colonne puisse être insérée (ou mise à jour).

@Entity
@Table(name = "THE_VIEW")
@SecondaryTable(name = "THE_TABLE", pkJoinColumns = @PrimaryKeyJoinColumn(name = "THE_ID"))
public class MyEntity {

    @Id
    @Column(name = "THE_ID")
    private Integer id;

    @Column(name = "VIEW_COLUMN", updatable = false, insertable = false)
    private String viewColumn

    @Column(name = "TABLE_COLUMN", table = "THE_TABLE")
    private String tableColumn;

(Je ne parle pas des vues modifiables ici)

2voto

Petar Bivolarski Points 545

Ajoutant aux réponses précédentes, une utilisation courante de insertable=false, updatable=false est de sauver des requêtes de base de données redondantes, améliorant ainsi les performances.

Imaginez avoir une classe Client, qui a une entité Parent. Si vous voulez simplement vérifier si un Client a un Parent, vous avez simplement besoin de vérifier la présence de la valeur dans sa colonne parent_id. Il n'est pas nécessaire de demander à Hibernate de récupérer l'entité Parent, avec éventuellement toutes ses autres associations, entraînant un nombre supplémentaire de requêtes :

public class Client {
    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private Parent parent;

    @Column(name = "parent_id", insertable = false, updatable = false)
    private UUID parentId;
}

Avec la configuration ci-dessus, le champ parentId va simplement récupérer toute valeur stockée dans la colonne parent_id, qui est uniquement éditée/mise à jour par l'entité Parent.

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