Spiegare insertable = false e updatable = false in riferimento all'annotazione JPA @Column


151

Se un campo è annotato insertable=false, updatable=false, non significa che non è possibile inserire valore o modificare il valore esistente? Perché vorresti farlo?

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

Risposte:


121

Lo faresti quando la responsabilità di creare / aggiornare l'entità correlata in questione non è nell'entità corrente . Ad esempio hai un Persone un Address. Ti piacerebbe aggiungere insertable=false, updatable=falsealla @OneToManyrelazione con l' Personentità Addressnell'entità, semplicemente perché non è responsabilità Addressdell'entità creare o aggiornare un Person. È il contrario.


Si riferisce alla definizione insertable=false,updatable=falsesu uno dei lati della relazione.
BalusC,

3
Stai dicendo che con updatable = false su Person disabiliterà l'aggiornamento di Person.name durante l'aggiornamento dell'indirizzo (non sono d'accordo poiché questo è lo scopo di cascata). Inoltre stai dicendo che la definizione di @Column fa qualcosa di diverso quando la sua chiave esterna (Persona) e quando non è una chiave esterna (poiché non esiste un'entità referenziata per disabilitare l'aggiornamento). Leggendo javadoc per aggiornabile direi che disabiliterà semplicemente la modifica della persona per un determinato indirizzo se una volta persiste. Puoi spiegare per favore?
Flowy,

8
Penso che volevi dire ... to the @ManyToOne relationship with the ...??
Martin Konecny,

112

La definizione insertable=false, updatable=falseè utile quando è necessario mappare un campo più di una volta in un'entità, in genere:

Questa è IMO non una cosa semantica, ma sicuramente tecnica.


15
Credo fermamente che questa risposta sia molto meglio di quella accettata. La risposta accettata trasmette la sensazione che l'attributo inseribile / aggiornabile abbia a che fare con la creazione / l'aggiornamento dell'entità correlata, mentre la vera intenzione dietro questi attributi è impedire l'inserimento / l'aggiornamento della colonna nell'entità corrente. La creazione / aggiornamento dell'entità correlata è affrontata dall'attributo a cascata dell'annotazione della mappatura.
Jayant,

26

Vorrei aggiungere alle risposte di BalusC e Pascal Thivent un altro uso comune di insertable=false, updatable=false:

Considera una colonna che non è un ID ma una sorta di numero di sequenza . La responsabilità per il calcolo del numero progressivo potrebbe non appartenere necessariamente all'applicazione.

Ad esempio, il numero di sequenza inizia con 1000 e dovrebbe aumentare di uno per ogni nuova entità. Ciò è facile da eseguire, e molto appropriatamente, nel database e in questi casi ha senso questa configurazione.


1
le sequenze sono supportate anche da JPA, quindi è possibile definire la sequenza anche con annotazioni JPA.
Eis,

9

Un altro esempio potrebbe essere nella colonna "Created_on" in cui si desidera consentire al database di gestire la creazione della data


Si suppone che Hibernate blocchi gli aggiornamenti in base a una annotazione updatable = false? Nel mio repository JPA test una colonna Created_on con questa annotazione accetta aggiornamenti senza lamentele.
chrisinmtown,

2
@chrisinmtown Eclipselink non includerà affatto la colonna in sql. Mi aspetto che sia lo stesso con Hibernate
Jaqen H'ghar il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.