Bitte erläutern Sie insertable = false und updatable = false in Bezug auf die Annotation JPA @Column

151

Wenn ein Feld mit Anmerkungen versehen ist insertable=false, updatable=false, bedeutet dies nicht, dass Sie keinen Wert einfügen oder den vorhandenen Wert ändern können? Warum willst du das tun?

@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
quelle

Antworten:

120

Sie würden dies tun, wenn die Verantwortung für das Erstellen / Aktualisieren der betreffenden zugehörigen Entität nicht bei der aktuellen Entität liegt. ZB hast du ein Personund ein Address. Sie möchten insertable=false, updatable=falsedie @OneToManyBeziehung zu der PersonEntität in der AddressEntität erweitern, einfach weil es nicht in der Verantwortung der AddressEntität liegt, eine zu erstellen oder zu aktualisieren Person. Es ist umgekehrt.

BalusC
quelle
Es bezieht sich auf die Definition insertable=false,updatable=falseauf einer der Seiten der Beziehung.
BalusC
3
Sie sagen, dass mit updatable = false on Person die Aktualisierung von Person.name beim Aktualisieren der Adresse deaktiviert wird (ich bin anderer Meinung, da dies der Zweck der Kaskade ist). Sie sagen auch, dass die @ Column-Definition etwas anderes tut, wenn ihr Fremdschlüssel (Person) und wenn es kein Fremdschlüssel ist (da es keine referenzierte Entität gibt, um die Aktualisierung zu deaktivieren). Wenn ich javadoc für updatable lese, würde ich sagen, dass es nur deaktiviert wird, die Person für die angegebene Adresse zu ändern, wenn sie einmal beibehalten wird. Kannst du bitte erklären?
Flowy
8
Ich denke du wolltest sagen ... to the @ManyToOne relationship with the ...??
Martin Konecny
110

Das Definieren insertable=false, updatable=falseist nützlich, wenn Sie ein Feld in einer Entität mehrmals zuordnen müssen, normalerweise:

Dies ist IMO keine semantische Sache, aber definitiv eine technische.

Pascal Thivent
quelle
15
Ich bin der festen Überzeugung, dass diese Antwort viel besser ist als die akzeptierte. Die akzeptierte Antwort vermittelt das Gefühl, dass ein einstellbares / aktualisierbares Attribut mit der Erstellung / Aktualisierung der zugehörigen Entität zu tun hat, während die eigentliche Absicht hinter diesen Attributen darin besteht, das Einfügen / Aktualisieren der Spalte in der aktuellen Entität zu verhindern. Die Erstellung / Aktualisierung der zugehörigen Entität wird durch das Kaskadenattribut der Zuordnungsanmerkung behandelt.
Jayant
25

Ich möchte den Antworten von BalusC und Pascal Thivent eine weitere häufige Verwendung hinzufügen insertable=false, updatable=false:

Stellen Sie sich eine Spalte vor, die keine ID, sondern eine Sequenznummer ist . Die Verantwortung für die Berechnung der Sequenznummer muss nicht unbedingt bei der Anwendung liegen.

Beispielsweise beginnt die Sequenznummer mit 1000 und sollte für jede neue Entität um eins erhöht werden. Dies ist in der Datenbank leicht und sehr angemessen möglich, und in solchen Fällen sind diese Konfigurationen sinnvoll.

Magnilex
quelle
1
Sequenzen werden auch von JPA unterstützt, sodass Sie Ihre Sequenz auch mit JPA-Annotationen definieren können.
Eis
8

Ein anderes Beispiel befindet sich in der Spalte "created_on", in der die Datenbank die Datumserstellung übernehmen soll

Johny19
quelle
Soll Hibernate Aktualisierungen basierend auf einer aktualisierbaren = falschen Anmerkung blockieren? In meinem JPA-Repository-Test akzeptiert eine Spalte "created_on" mit dieser Anmerkung Aktualisierungen ohne Beanstandung.
Chrisinmtown
1
@chrisinmtown Eclipselink wird die Spalte überhaupt nicht in die SQL aufnehmen. Ich
gehe davon aus,