Persistencia de Java / JPA: @Column vs @Basic

119

¿Cuál es la diferencia entre las anotaciones @Columny @Basicen JPA? ¿Se pueden usar juntos? ¿Deben usarse juntos? ¿O basta con uno de ellos?

Hosam Aly
fuente

Respuestas:

147
  • @Basicsignifica que un atributo debe persistir y se debe utilizar una asignación estándar. Tiene parámetros que le permiten especificar si el atributo debe cargarse de forma diferida y si acepta valores NULL.

  • @Column le permite especificar el nombre de la columna de la base de datos en la que se conservará el atributo.

Si especifica uno sin el otro, obtiene un comportamiento predeterminado que es sensato, por lo que comúnmente la gente usa solo uno con la excepción de casos especiales.

Entonces, si quisiéramos una carga diferida de un atributo y especificar un nombre de columna, podemos decir

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

Si necesitáramos el comportamiento predeterminado, no perezoso, entonces solo @Columnhabría sido suficiente.

djna
fuente
2
Esta es una respuesta clara. Gracias. Así que supongo que se puede usar @Basicsin @Column, razón por la cual las propiedades optionaly nullableexisten en ambos. Estoy en lo cierto?
Hosam Aly
1
No pretendo comprender completamente la especificación JPA sobre las diferencias entre los valores anulables de @ Basic y los valores anulables de @ Column y el efecto de especificar ninguno, uno o ambos. @Basic anulable se describe como una "pista" con relevancia para la generación de esquemas. @Column anulable se describe como la definición de las características de la columna en la base de datos. Mi práctica sería usar el caso @Column.
Djna
16
@Basic (opcional) es (debe ser) verificado en tiempo de ejecución por el proveedor de persistencia antes de guardar en la base de datos. @Column es una definición de columna en la base de datos y se utiliza para la generación de esquemas: stackoverflow.com/questions/2899073/…
Piotr Gwiazda
2
ese 'no vago', llama EAGER. LOL
solvator
7
Las anotaciones de JPA se pueden dividir en dos grupos: las anotaciones relacionales puras versus las anotaciones de implementación. Las anotaciones relacionales puras contienen: Entity, Basic, OneToOne, OneToMany, ManyToMany, ... mientras que las anotaciones de implementación dan pistas sobre cómo mapear el modelo teórico puro a una base de datos real: Tabla, Columna, ... En su pregunta 'Básico 'es una anotación para proporcionar información sobre el atributo de la entidad relacional, mientras que' Columna 'proporciona información sobre cómo asignarlo a una columna de la base de datos.
Bruno Ranschaert
50

Además de la respuesta de @ djna , vale la pena señalar que @Basicdebe compararse con @OneToMany, @ManyToOney @ManyToMany. Solo se puede especificar uno de estos en cualquier propiedad.

@Columny @JoinColumnse puede especificar junto con cualquiera de estos para describir las propiedades de la columna de la base de datos.

Estos son dos conjuntos de anotaciones que se pueden usar juntos, pero solo se puede usar una anotación de cada conjunto a la vez.

Hosam Aly
fuente
21

Vale la pena señalar que Basic está diseñado para campos primitivos.

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

Un atributo básico es aquel en el que la clase de atributo es de un tipo simple como Cadena, Número, Fecha o una primitiva. El valor de un atributo básico puede correlacionarse directamente con el valor de la columna en la base de datos.

Los tipos y conversiones admitidos dependen de la implementación de JPA y la plataforma de base de datos. Cualquier atributo básico que utilice un tipo que no se asigne directamente a un tipo de base de datos puede serializarse a un tipo de base de datos binaria.

La forma más sencilla de mapear un atributo básico en JPA es no hacer nada. Cualquier atributo que no tenga otras anotaciones y no haga referencia a otras entidades se asignará automáticamente como básico, e incluso se serializará si no es un tipo básico. El nombre de la columna para el atributo será predeterminado, con el mismo nombre que el nombre del atributo, en mayúsculas.

Charla
fuente
Buena nota. Gracias.
Hosam Aly
1
No, si no se especifica ninguna anotación de columna, se aplican los valores predeterminados (el nombre será el atributo uno).
Gab
2

La anotación @Basic se aplica a las entidades JPA, y la de @Column se aplica a las columnas de la base de datos. El atributo opcional de la anotación @Basic define si el campo de la entidad puede ser nulo o no; por otra parte,

  • El atributo que acepta valores NULL de la anotación @Column especifica si la columna de la base de datos correspondiente puede ser nula
  • Podemos usar @Basic para indicar que un campo debe cargarse de forma diferida
  • La anotación @Column nos permite especificar el nombre de la columna de la base de datos mapeada
  • La anotación @Basic marca la propiedad como no opcional en el nivel del objeto Java. Y (nullable = false) en la asignación de columnas, solo es responsable de la generación de una restricción de base de datos NOT NULL.
Sonu patel
fuente