Сохранение Java / JPA: @Column против @Basic


119

В чем разница между @Columnи @Basicаннотаций в JPA? Можно ли их использовать вместе? Следует ли их использовать вместе? Или одного из них достаточно?

Ответы:


147
  • @Basicозначает, что атрибут должен быть сохранен и должно использоваться стандартное отображение. У него есть параметры, которые позволяют указать, должен ли атрибут загружаться лениво и допускать ли его значение NULL.

  • @Column позволяет указать имя столбца в базе данных, в котором должен быть сохранен атрибут.

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

Итак, если нам нужна ленивая загрузка атрибута и указание имени столбца, мы можем сказать

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

Если бы нам нужно было по умолчанию неленивое поведение, этого @Columnбыло бы достаточно.


2
Это ясный ответ. Спасибо. Таким образом , я полагаю , можно использовать @Basicбез @Column, именно поэтому optionalи nullableсвойства существуют в обоих. Я прав?
Хосам Али

1
Я не утверждаю, что полностью понимаю спецификацию JPA о различиях между обнуляемыми значениями @ Basic и @ Column, допускающими значение NULL, а также эффект от указания ни того, ни другого или обоих. @Basic nullable описывается как "подсказка" относительно генерации схемы. @Column nullable описывается как определение характеристик столбца в базе данных. Моя практика заключалась бы в использовании случая @Column.
djna 05

16
@Basic (необязательно) проверяется (должен быть) проверен во время выполнения поставщиком сохраняемости перед сохранением в БД. @Column - это определение столбца в базе данных, которое используется для генерации схемы: stackoverflow.com/questions/2899073/…
Петр Гвязда,

2
«не ленивый», - зовет ИДЖЕР. LOL
солватор

7
Аннотации JPA можно разделить на две группы: чисто реляционные аннотации и аннотации реализации. Чистые реляционные аннотации содержат: Entity, Basic, OneToOne, OneToMany, ManyToMany, ... в то время как аннотации реализации дают подсказки о том, как сопоставить чисто теоретическую модель с реальной базой данных: Table, Column, ... В вашем вопросе 'Basic 'представляет собой аннотацию для предоставления информации об атрибуте реляционной сущности, а' Столбец 'предоставляет информацию о том, как сопоставить его со столбцом базы данных.
Bruno Ranschaert

50

Помимо ответа @djna стоит отметить, что @Basicследует сравнивать с @OneToMany, @ManyToOneи @ManyToMany. Только один из них может быть указан для любого свойства.

@Columnи @JoinColumnможет быть указан вместе с любым из них для описания свойств столбца базы данных.

Это два набора аннотаций, которые можно использовать вместе, но одновременно можно использовать только одну аннотацию каждого набора.


21

Стоит отметить, что Basic предназначен для примитивных полей.

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

Базовый атрибут - это атрибут, класс атрибута которого представляет собой простой тип, например String, Number, Date или примитив. Значение базового атрибута может напрямую отображаться на значение столбца в базе данных.

Поддерживаемые типы и преобразования зависят от реализации JPA и платформы базы данных. Любой базовый атрибут, использующий тип, который не отображается напрямую на тип базы данных, может быть сериализован в двоичный тип базы данных.

Самый простой способ сопоставить базовый атрибут в JPA - ничего не делать. Любые атрибуты, которые не имеют других аннотаций и не ссылаются на другие сущности, будут автоматически сопоставлены как базовые и даже сериализованные, если не базовый тип. Имя столбца для атрибута будет задано по умолчанию, названо так же, как имя атрибута, в верхнем регистре.


Хорошее примечание. Спасибо.
Хосам Али

1
Нет, если аннотация столбца не указана, применяются значения по умолчанию (имя будет атрибутом один).
Габ

2

Аннотации @Basic применяются к объектам JPA, а аннотации @Column применяются к столбцам базы данных. Необязательный атрибут аннотации @Basic определяет, может ли поле объекта иметь значение NULL или нет; с другой стороны,

  • Атрибут аннотации @Column, допускающий значение NULL, указывает, может ли соответствующий столбец базы данных иметь значение NULL
  • Мы можем использовать @Basic, чтобы указать, что поле должно загружаться лениво.
  • Аннотация @Column позволяет нам указать имя сопоставленного столбца базы данных.
  • Аннотация @Basic отмечает свойство как необязательное на уровне объекта Java. И (nullable = false) в сопоставлении столбцов отвечает только за создание ограничения базы данных NOT NULL.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.