Наполегливість Java / JPA: @Column vs @Basic


119

Яка різниця між примітками @Columnта @Basicпримітками у JPA? Чи можна їх використовувати разом? Чи слід їх використовувати разом? Або одного з них вистачає?

Відповіді:


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

  • @Column дозволяє вказати ім'я стовпця в базі даних, до якої повинен зберігатися атрибут.

Якщо ви вказуєте один без іншого, ви отримуєте розумну поведінку за замовчуванням, тому люди зазвичай використовують лише одну, за винятком особливих випадків.

Отже, якщо ми хотіли ледачого завантаження атрибута та вказати ім'я стовпця, ми можемо сказати

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

Якби ми не потребували поведінки за замовчуванням, не лінивої поведінки, тоді просто @Columnбуло б достатньо.


2
Це чітка відповідь. Дякую. Тому я припускаю, що можна використовувати і @Basicбез цього @Column, тому властивості optionalта nullableвластивості існують в обох. Маю рацію?
Хосам Алі

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

16
@Basic (необов'язково) перевіряється під час виконання постачальником завзятості перед збереженням у БД. @Column - це визначення стовпців у базі даних та використовується для генерації схем: stackoverflow.com/questions/2899073/…
Piotr Gwiazda

2
що "не лінивий", називає EAGER. LOL
сольватор

7
Анотації JPA можна розділити на дві групи: чисті реляційні анотації проти приміток щодо реалізації. Чисті реляційні анотації містять: Entity, Basic, OneToOne, OneToMany, ManyToMany, ... в той час як анотації щодо впровадження дають підказки про те, як зіставити чисту теоретичну модель у реальну базу даних: Таблиця, стовпець, ... У вашому запитанні Основні '- це примітка для надання інформації про атрибут відносної сутності, а "Колонка" - інформація про те, як відобразити її у стовпчику бази даних.
Бруно Раншаерт

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 визначає, чи може поле сутності бути нульовим чи ні; з іншої сторони,

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