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
-
nameytablese pueden usar junto concolumnDefinition, ninguno de loscolumnDefinitionse reemplaza -
nullablees 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,scaleson anuladas / hechas redundantes por elcolumnDefinition- son integrales al tipo -
insertableyupdateablese 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.