2010-09-27 2 views
89

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

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

risposta

75

Si potrebbe farlo quando il responsabilità di creazione/aggiornamento del relativo ente in questione non è nella corrente entità . Per esempio. hai un Person e un Address. Vorresti aggiungere insertable=false, updatable=false alla relazione @OneToMany con l'entità Person nell'entità Address, semplicemente perché non è responsabilità dell'entità Address creare o aggiornare uno Person. È il contrario.

+0

Si riferisce alla definizione di 'inseribile = false, aggiornabile = false' su uno dei lati della relazione . – BalusC

+0

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 @Column fa qualcosa di diverso quando la sua chiave esterna (Person) e quando non è una chiave esterna (in quanto non esiste un'entità referenziata per disabilitare l'aggiornamento). Leggendo javadoc per aggiornabile direi che sarà semplicemente disabilitare per cambiare la Persona per un dato indirizzo se è persistente una volta. Puoi spiegare per favore? – Flowy

+1

Penso che volevi dire '... alla relazione @ManyToOne con il ...' ?? –

65

Definizione insertable=false, updatable=false è utile quando si ha bisogno di mappare un campo più di una volta in un'entità, in genere:

Questa non è una IMO semantica, ma decisamente tecnica.

+5

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 l'intenzione reale dietro questi attributi è di impedire l'inserimento/aggiornamento della colonna nell'entità corrente. La creazione/aggiornamento dell'entità correlata viene affrontata dall'attributo cascade dell'annotazione di mappatura. Le sequenze – Jayant

15

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

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

Ad esempio, il numero di sequenza inizia con 1000 e dovrebbe aumentare di uno per ogni nuova entità. Questo è fatto facilmente, e molto appropriatamente, nel database, e in tali casi ha senso queste configurazioni.

+0

sono supportate anche da JPA, quindi è possibile definire la sequenza con le annotazioni JPA. – eis

1

Un altro esempio potrebbe essere sulla colonna "created_on" in cui si desidera lasciare il database gestire la data di creazione

+0

Hibernate si suppone che blocchi gli aggiornamenti in base a un'aggiornamento = annotazione errata? Nel mio repository JPA test una colonna created_on con questa annotazione accetta aggiornamenti senza reclamo. – chrisinmtown