JPA: Что я должен использовать? Базовый (необязательный) или Столбец (с нулевым значением)?

Для простого строкового поля

@Entity
class Foo {

    //1. @Basic(optional = false)
    //2. @Column(length = 100, nullable = false)
    String name;
}

Мне нужно ограничить длину имени, используя аннотацию @Column, но меня путают с атрибутом nullable. Хотя я использую другие аннотации, такие как @ManyToOne и @OneToMany, которые используют атрибуты optional, я хотел бы использовать @Basic(optional), чтобы сохранить большинство аннотаций единообразными. Но я не могу ограничить длину имени @Basic.

Итак, где я должен аннотировать атрибут nullable, @Basic или @Column?

ИЗМЕНИТЬ

Просто скажите, в какой форме вы бы предпочли:

Форма 1:

@Entity
class Foo {
    @Basic(optional = false)
    @Column(length = 100)
    String name;
}

Форма 2:

@Entity
class Foo {
    @Column(length = 100, nullable = false)
    String name;
}

Хорошо лично мне нравится форма 1, потому что атрибут optional также используется аннотациями @ManyToOne и т.д., но форма 2 также хороша, потому что это делается в одиночной аннотации.

ИЗМЕНИТЬ

После чтения http://markmail.org/message/osod6rsauwbnkvya у меня есть разница между @Basic.optional и @Column.nullable. Но я до сих пор не знаю, какой из них я должен использовать. Кажется хорошим включить оба аннотации, поэтому четко определите базовую таблицу и проверьте значение null в JPA, прежде чем фактическое обновление может быть немного быстрее.

Ответ 1

Из документации API:

@Basic:

@Базовая аннотация - простейший тип отображения в столбец базы данных. Основная аннотация может быть применена к постоянное свойство или экземпляр переменная любого из следующих типы: примитивные типы Java, оболочки из примитивных типов, String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, byte [], Byte [], char [], Character [], перечисления и любой другой тип, который реализует Serializable.

@Column

@Column Используется для указания сопоставленного столбец для постоянного свойства или поле. Если аннотация No Column отсутствует указано, значения по умолчанию: приложенное.

Итак, если вы не укажете @Column, он получает значение столбца из getter/setter. Если вам нужно указать имя столбца, вы должны аннотировать @Column.

@Basic позволяет указать тип выборки. Если вы хотите изменить тип выборки по умолчанию, вы должны использовать эту аннотацию, иначе ее можно опустить.