2010-09-27 18 views
89

Si un campo tiene la anotación insertable=false, updatable=false, ¿no significa que no puede insertar valor ni cambiar el valor existente? ¿Por qué querrías hacer eso?Explicar sobre: ​​insertable = falso, actualizable = falso

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

Respuesta

75

Harías que cuando el responsabilidad de crear/actualizar la entidad relacionada en cuestión no se encuentra en la actual entidad. P.ej. tiene un Person y un Address. Desea agregar insertable=false, updatable=false a la relación @OneToMany con la entidad Person en la entidad Address, simplemente porque no es responsabilidad de la entidad Address crear o actualizar un Person. Es al revés.

+0

Se refiere a la definición de 'insertable = false, actualizable = false' en uno de los lados de la relación . – BalusC

+0

Usted dice que con updatable = false en Person se desactivará 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 (Person) y cuando no es una clave foránea (ya que no hay ninguna entidad referenciada para deshabilitar la actualización). Al leer javadoc para actualizable, diría que simplemente desactivará para cambiar a Persona para una dirección dada si una vez persiste. ¿Puedes explicar por favor? – Flowy

+1

Creo que quisiste decir '... a la relación @ManyToOne con ... '?? –

65

Definición insertable=false, updatable=false es útil cuando se necesita para asignar un campo más de una vez en una entidad, por lo general:

Ésta es la OMI no es una cosa semántica, pero sin duda un problema técnico.

+5

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. Las secuencias de – Jayant

15

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

Considérese una columna que no es un Identificación pero algún tipo de secuencia de números. 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 muy apropiadamente, en la base de datos, y en tales casos estas configuraciones tienen sentido.

+0

también son compatibles con JPA, por lo que también puede definir su secuencia con anotaciones JPA. – eis

1

Otro ejemplo sería en la columna "created_on" en la que desea dejar la base de datos manejar la fecha de creación

+0

¿Supone Hibernate bloquear actualizaciones basadas en una anotación actualizable = falsa? En mi prueba de repositorio JPA, una columna created_on con esta anotación acepta actualizaciones sin queja. – chrisinmtown