Ответ 1
Мой ответ: все следующие должны быть переопределены (т.е. опишите их все в columndefinition
, если это необходимо):
-
length
-
precision
-
scale
-
nullable
-
unique
то есть. столбец DDL будет состоять из: name
+ columndefinition
и больше ничего.
Обоснование следует.
-
Аннотации, содержащие слово "Столбец" или "Таблица", являются чисто физическими свойствами, которые используются только для управления DDL/DML с базой данных.
-
Другие примечания чисто логические - свойства, используемые в памяти в java для управления обработкой JPA.
-
Вот почему иногда кажется, что опция /nullability устанавливается дважды - один раз через
@Basic(...,optional=true)
и один раз через@Column(...,nullable=true)
. Бывший говорит, что атрибут/ассоциация может быть нулевой в объектной модели JPA (в памяти) во время очистки; последний говорит, что столбец DB может быть нулевым. Обычно вы хотите, чтобы они устанавливали одинаковые, но не всегда, в зависимости от того, как таблицы БД устанавливаются и используются повторно.
В вашем примере свойства length и nullable являются переопределенными и избыточными.
Итак, при указании columnDefinition другие свойства @Column становятся лишними?
-
В JPA Spec и javadoc:
-
columndefinition
определение: Фрагмент SQL, который используется при генерации DDL для столбца. -
columndefinition
default: Сгенерированный SQL для создания столбца выводимого типа. -
Приведены следующие примеры:
@Column(name="DESC", columnDefinition="CLOB NOT NULL", table="EMP_DETAIL") @Column(name="EMP_PIC", columnDefinition="BLOB NOT NULL")
-
И, ошибаюсь..., это действительно так.: - $?!
Указывает ли columnDefinition другие свойства, предоставленные в одной аннотации?
Спецификация javadoc и JPA не объясняет это явно - спецификация не дает большой защиты. Чтобы быть на 100% уверенным, протестируйте свою выбранную реализацию.
-
-
Из примеров, приведенных в спецификации JPA
можно смело подразумевать следующее:-
name
иtable
могут использоваться вместе сcolumndefinition
, и они не переопределяются -
nullable
переопределяется/резервируется с помощьюcolumndefinition
-
-
Из "логики ситуации" справедливо можно сделать следующее: (я просто сказал, что??: -P):
-
length
,precision
,scale
переопределены/сделаны избыточными с помощьюcolumndefinition
- они являются неотъемлемой частью типа -
insertable
иupdateable
предоставляются отдельно и никогда не включаются вcolumndefinition
, поскольку они управляют генерацией SQL в памяти, прежде чем она будет отправлена в базу данных.
-
-
Это оставляет свойство "
unique
". Он аналогичен nullable - расширяет/квалифицирует определение типа, поэтому его следует рассматривать как интегральное определение типа. то есть должно быть переопределено.
Проверить мой ответ Для столбцов "A" и "B" соответственно:
@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"
- подтверждение сгенерированной таблицы имеет правильный тип/допустимость/уникальность
- опционально, вставьте и обновите JPA: прежний должен включать столбец A, последний столбец B