java - false - ¿Qué propiedades hace @Column columnDefinition hacer redundante?
java @lob (2)
Mi respuesta: se debe anular todo lo siguiente (es decir, describirlos todos dentro de la columndefinition
, si corresponde):
-
length
-
precision
-
scale
-
nullable
-
unique
es decir, la columna DDL consistirá en: name
+ columndefinition
y nada más .
La razón sigue.
La anotación que contiene la palabra "Columna" o "Tabla" es puramente física; las propiedades solo se usan para controlar DDL / DML contra la base de datos.
Otra anotación puramente lógica: propiedades utilizadas en la memoria en java para controlar el procesamiento de JPA.
Es por eso que a veces parece que la opción / nulability se establece dos veces: una vez a través de
@Basic(...,optional=true)
y una vez a través de@Column(...,nullable=true)
. El ex dice que el atributo / asociación puede ser nulo en el modelo de objetos JPA (en memoria), en el momento del vaciado; el último dice que la columna DB puede ser nula. Por lo general, desearía que se configuraran de la misma manera, pero no siempre , dependiendo de cómo se configuran y reutilizan las tablas de BD.
En su ejemplo, las propiedades de longitud y anulables se anulan y son redundantes.
Entonces, cuando se especifica columnDefinition, ¿qué otras propiedades de @Column se vuelven redundantes?
En JPA Spec & javadoc:
Definición de
columnDefinition
: el fragmento de SQL que se utiliza al generar el DDL para la columna.predeterminado de
columnDefinition
: SQL generado para crear una columna del tipo inferido.Se proporcionan los siguientes ejemplos:
@Column(name="DESC", columnDefinition="CLOB NOT NULL", table="EMP_DETAIL") @Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
Y, err ..., eso es realmente. ps
¿ColumnDefinition reemplaza otras propiedades proporcionadas en la misma anotación?
Las especificaciones javadoc y JPA no abordan explícitamente esto: las especificaciones no ofrecen una gran protección. Para estar 100% seguro, prueba con la implementación elegida.
Lo siguiente puede estar implícito de forma segura a partir de ejemplos proporcionados en la especificación JPA
-
name
ytable
se pueden usar junto concolumnDefinition
, ninguno de loscolumnDefinition
se reemplaza -
nullable
es anulado / hecho redundante porcolumnDefinition
-
Lo siguiente puede implicarse de manera bastante segura a partir de la "lógica de la situación" (¿acabo de decir eso? :-P):
-
length
,precision
,scale
son anuladas / hechas redundantes por elcolumnDefinition
- son integrales al tipo -
insertable
yupdateable
se proporcionan por separado y nunca se incluyen encolumnDefinition
, ya que controlan la generación de SQL en la memoria, antes de que se emita en la base de datos.
-
Eso deja solo la propiedad "
unique
". Es similar a anulables: amplía / califica la definición de tipo, por lo que debe tratarse como integral a la definición de tipo. es decir, debe ser anulado.
Pruebe mi respuesta para las columnas "A" y "B", respectivamente:
@Column(name="...", table="...", insertable=true, updateable=false,
columndefinition="NUMBER(5,2) NOT NULL UNIQUE"
@Column(name="...", table="...", insertable=false, updateable=true,
columndefinition="NVARCHAR2(100) NULL"
- confirmar que la tabla generada tiene el tipo / nulabilidad / unicidad correctos
- Opcionalmente, haga la inserción y actualización de JPA: el anterior debe incluir la columna A, la última columna B
A menudo especifico mis anotaciones de @Column
como esta:
@Column(columnDefinition="character varying (100) not null",length=100,nullable=false)
Como puede ver, especifico la length
y se pueden columnDefinition
a pesar de que columnDefinition
ya los especifica. Eso es porque no sé dónde / cuándo se usan estos valores exactamente.
Entonces, cuando se especifica columnDefinition
, ¿qué otras propiedades de @Column
se @Column
redundantes?
Si es importante, uso Hibernate y PostgreSQL
columnDefinition anulará el DDL sql generado por hibernación para esta columna en particular, no es portátil y depende de la base de datos que esté utilizando. Puede usarlo para especificar nullable, longitud, precisión, escala ... ect.