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

Resuelto Thang Pham asked hace 14 años • 8 respuestas

Si un campo está anotado insertable=false, updatable=false, ¿no significa que no puede insertar un 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 avatar Sep 27 '10 22:09 Thang Pham
Aceptado

Lo haría cuando la responsabilidad de crear/actualizar la entidad de la columna a la que se hace referencia no esté en la entidad actual , sino en otra entidad.

BalusC avatar Sep 27 '2010 16:09 BalusC

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

  • cuando se utiliza una clave compuesta
  • cuando se utiliza una clave primaria compartida
  • cuando se utilizan claves primarias en cascada

En mi opinión, esto no es una cuestión semántica, sino definitivamente técnica.

Pascal Thivent avatar Sep 27 '2010 19:09 Pascal Thivent

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 una especie de número de secuencia . La responsabilidad de calcular el número de secuencia puede no pertenecer necesariamente 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 avatar Apr 23 '2013 09:04 Magnilex

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

Johny19 avatar Aug 01 '2017 17:08 Johny19