Explique acerca de insertable=false y updatable=false en referencia a la anotación JPA @Column.
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;
}
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.
La definición insertable=false, updatable=false
es ú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.
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.
Otro ejemplo sería en la columna "created_on" donde desea permitir que la base de datos maneje la fecha de creación.