Сохранение Java/JPA: @Column vs @Basic

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

Ответ 1

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

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

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

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

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

Если мы выполним стандартное, нелазное поведение, то просто @Column было бы достаточно.

Ответ 2

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

Ответ 3

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

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

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

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

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