В чем разница между аннотациями @Column
и @Basic
в JPA? Могут ли они использоваться вместе? Должны ли они использоваться вместе? Или достаточно одного из них?
Сохранение Java/JPA: @Column vs @Basic
Ответ 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 - ничего не делать. Любые атрибуты, которые не имеют других аннотаций и не ссылаются на другие сущности, будут автоматически отображаться как базовые и даже сериализованные, если не базовый тип. Имя столбца для атрибута будет дефолтом по умолчанию, именоваться так же, как имя атрибута, как заглавное.