Explique acerca de insertable = false y updatedtable = false en referencia a la anotación JPA @Column

151

Si un campo está anotado insertable=false, updatable=false, ¿no significa que no puede insertar valor ni cambiar el valor existente? ¿Por qué querrías hacer eso?

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

Respuestas:

121

Haría eso cuando la responsabilidad de crear / actualizar la entidad relacionada en cuestión no esté en la entidad actual . Por ejemplo, tienes un Persony un Address. Desea agregar insertable=false, updatable=falsea la @OneToManyrelación con la Personentidad en la Addressentidad, simplemente porque no es responsabilidad de la Addressentidad crear o actualizar a Person. Es al revés.

BalusC
fuente
Se refiere a definir insertable=false,updatable=falseen uno de los lados de la relación.
BalusC
3
Está diciendo que con Updatable = false en Person deshabilitará la actualización de Person.name al actualizar la dirección (no estoy de acuerdo ya que este es el propósito de la cascada). También está diciendo que la definición de @Column hace algo diferente cuando su clave externa (Persona) y cuando no es una clave externa (ya que no hay una entidad referenciada para deshabilitar la actualización). Al leer javadoc para actualizar, diría que simplemente deshabilitará el cambio de Persona para la Dirección dada si alguna vez persiste. ¿Puedes explicar por favor?
Flowy
8
Creo que querías decir ... to the @ManyToOne relationship with the ...?
Martin Konecny
111

La definición insertable=false, updatable=falsees útil cuando necesita asignar un campo más de una vez en una entidad, generalmente:

Esto es IMO, no una cosa semántica, sino definitivamente técnica.

Pascal Thivent
fuente
15
Creo firmemente que esta respuesta es mucho mejor que la aceptada. La respuesta aceptada transmite la sensación de que el atributo insertable / actualizable tiene que ver con la creación / actualización de la entidad relacionada, mientras que la intención real detrás de estos atributos es evitar la inserción / actualización de la columna en la entidad actual. La creación / actualización de la entidad relacionada se aborda mediante el atributo en cascada de la anotación de mapeo.
Jayant
25

Me gustaría agregar a las respuestas de BalusC y Pascal Thivent otro uso común de insertable=false, updatable=false:

Considere una columna que no es una identificación, sino algún tipo de número de secuencia . La responsabilidad de calcular el número de secuencia no necesariamente pertenece a la aplicación.

Por ejemplo, el número de secuencia comienza con 1000 y debe incrementarse en uno para cada nueva entidad. Esto se hace fácilmente, y de manera muy apropiada, en la base de datos, y en tales casos estas configuraciones tienen sentido.

Magnilex
fuente
1
JPA también admite secuencias, por lo que también puede definir su secuencia con anotaciones JPA.
EIS
8

Otro ejemplo sería en la columna "created_on" donde desea permitir que la base de datos maneje la creación de la fecha

Johny19
fuente
¿Se supone que Hibernate bloquea las actualizaciones basadas en una anotación actualizable = false? En mi prueba de repositorio JPA, una columna created_on con esta anotación acepta actualizaciones sin quejas.
chrisinmtown
1
@chrisinmtown Eclipselink no incluirá la columna en el sql en absoluto. Espero que sea lo mismo con Hibernate
Jaqen H'ghar