Какие свойства @Column columnDefinition делают излишним?

Я часто указываю свои аннотации @Column следующим образом:

@Column(columnDefinition="character varying (100) not null",length=100,nullable=false)

Как вы можете видеть, я указываю length и nullable, хотя columnDefinition уже указывает их. Это потому, что я не знаю, где/когда эти значения используются точно.

Итак, при указании columnDefinition, какие другие свойства @Column становятся избыточными?

Если это имеет значение, я использую Hibernate и PostgreSQL

Ответы

Ответ 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

Ответ 2

columnDefinition переопределит DDL sql, сгенерированный спящим для данного столбца, он не переносится и зависит от используемой базы данных. Вы можете использовать его, чтобы указать значение NULL, длину, точность, масштаб... ect.