Співбесіда з Java EE - Java Persistence API (JPA) (питання та відповіді)
Співбесіда з Java EE - Java Persistence API (JPA) (питання та відповіді). Частина 1
Загальні питання та відповіді про Java Persistence API - JPA. Частина 1.
Цей розділ був скопійований із статті хабра https://habrahabr.ru/post/265061/, т.к. там розглянуто багато стандартних, а також більш поглиблених тем. Так само можете подивитися розділ по Hibernate (фреймворк є реалізацією JPA і взаємопов'язані теми), перейшовши до списку питань розділу EE.
до списку питань розділу JEE
1. Що таке JPA? 2. У чому її відмінність JPA від Hibernate? 3. Чи можна використовувати JPA з noSQl базами? 4. У чому відмінність JPA від JDO? 5. Що таке Entity? 6. Чи може Entity клас успадковуватися від Entity класів (non-entity classes)? 7. Чи може Entity клас успадковуватись від інших Entity класів? 8. Чи може Entity клас успадковуватися від Entity класу? 9. Чи може бути Entity абстрактним класом? 10. Які вимоги JPA до Entity класів ви можете перерахувати (щонайменше шість вимог)? 11. Які два типи елементів є у Entity класів. Або тобто перерахуйте два типи доступу (access) до елементів Entity класів. 12. Що таке атрибут Entity класу у термінології JPA? 13. Які типи даних допустимі у атрибутах Entity класу (полях чи властивостях)? 14. Які типи даних можна використовувати в атрибутах, що входять до первинного ключа Entity класу (складовий або простий), щоб отриманий первинний ключ міг використовуватися для будь-якої бази даних? А у разі автогенерованого первинного ключа (generated primary keys)? 15. Що таке вбудований (Embeddable) клас? 16. Чи може клас, що вбудовується (Embeddable) містити інший вбудований (Embeddable) клас? 17. Чи може вбудований (Embeddable) класмістити зв'язки з іншими Entity або колекціями Entity? Якщо може, то чи існують якісь обмеження на такі зв'язки (relationship)? 18. Які вимоги JPA встановлює до класів, що вбудовуються (Embeddable)? 19. Які типи зв'язків (relationship) між Entity ви знаєте (перерахуєте вісім типів, або вкажіть чотири типи зв'язків, кожну з яких можна розділити ще два види)? 20. Що таке Mapped Superclass? 21. Які три типи стратегії спадкування мапінгу (Inheritance Mapping Strategies) описані в JPA? 22. Які два типи fetch стратегії в JPA ви знаєте? 23. Що таке EntityManager і які основні його функції можна перерахувати? 24. Які чотири статуси життєвого циклу Entity об'єкта (Entity Instance's Life Cycle) ви можете перерахувати? 25. Як впливає операція persist на Entity об'єкти кожного із чотирьох статусів? 26. Як впливає операція remove на Entity об'єкти кожного із чотирьох статусів? 27. Як впливає операція merge на Entity об'єкти кожного із чотирьох статусів? 28. Як впливає операція refresh на Entity об'єкти кожного із чотирьох статусів? 29. Як впливає операція detach на Entity об'єкти кожного із чотирьох статусів?
30. Навіщо потрібна інструкція Basic? 31. Навіщо потрібна інструкція Access? 32. Якими анотаціями можна перекрити зв'язки (override entity relationship) або атрибути, успадковані від суперкласу, або задані в embeddable класі при використанні цього embeddable класу в одному з entity класів і не перекривати в інших? 33. Якою інструкцією можна керувати кешуванням JPA для цього Entity? 34. Які анотації служить для завдання класу перетворення basic атрибуту Entity на інший тип при збереженні/отриманні даних їх бази (наприклад, працювати з атрибутом Entityboolean типу, але в базі зберігати його як число)? 35. Якою анотацією можна задати клас, методи якого має виконатися за певних JPA операцій над даним Enitity або Mapped Superclass (такі як видалення, зміна даних тощо)? 36. Навіщо потрібні callback методи в JPA? До яких сутностей застосовуються інструкції callback методів? Перерахуйте сім callback методів (або що те саме анотацій callback методів) 37. Які інструкції слугують для встановлення порядку видачі елементів колекцій Entity? 38. Якою анотацією можна виключити поля та властивості Entity з мапінгу (property or field is not persistent)? 40. Які два види кешів (cache) ви знаєте в JPA і навіщо вони потрібні? 41. Які варіанти налаштування second-level cache (кеша другого рівня) в JPA або що аналогічно опишіть які значення може приймати елемент shared-cache-mode з persistence.xml? 42. Як можна змінити налаштування fetch стратегії будь-яких атрибутів Entity для окремих запитів (query) або методів пошуку (find), то якщо Enity має атрибут з fetchType = LAZY, але для конкретного запиту його потрібно зробити EAGER чи навпаки? 43. Яким чином можна в коді працювати з кешем другого рівня (видаляти всі або певні Entity з кешу, дізнатися чи закешувався дане Entity і т.п.)? 44. Яким способом можна отримати метадані JPA (відомості про Entity типи, Embeddable і Managed класи тощо)? 45. Що таке JPQL (Java Persistence query language) і чим він відрізняється від SQL? 46. Що означає поліморфізм (polymorphism) у запитах JPQL (Java Persistence query language) та як його «вимкнути»? 47. Що таке Criteria API і навіщо він використовується? 48. У чому різниця у вимогах до Entity у Hibernate, від вимог до Entity, зазначених у специфікації JPA (див.питання 10)? 49. Яка унікальна стратегія успадкування є у Hibernate, але немає у специфікації JPA? 50. Які основні нові можливості з'явилися у специфікації JPA 2.1 порівняно з JPA 2.0 (перерахуйте хоча б п'ять-шість нових можливостей)?
1. Що таке JPA?
JPA (Java Persistence API) це специфікація Java EE і Java SE, що описує систему управління збереженням java об'єктів у таблиці реляційних баз даних у зручному вигляді. Сама Java не містить реалізації JPA, проте існує багато реалізацій даної специфікації від різних компаній (відкритих і ні). Це не єдиний спосіб збереження java об'єктів у базі даних (ORM систем), але один із найпопулярніших у Java світі.
2. У чому її відмінність JPA від Hibernate?
Hibernate одна з найпопулярніших відкритих реалізацій останньої версії специфікації (JPA 2.1). Навіть скоріше найпопулярніша, майже стандарт де-факто. Тобто JPA тільки описує правила і API, а Hibernate реалізує ці описи, втім Hibernate (як і в багатьох інших реалізацій JPA) є додаткові можливості, не описані в JPA (і не переносяться на інші реалізації JPA).
3. Чи можна використовувати JPA з noSQl базами?
Взагалі, специфікація JPA говорить лише про відображенні java об'єктів у таблиці реляційних баз даних, але при цьому існує низка реалізацій даного стандарту для баз даних NoSql: Kundera, DataNucleus, ObjectDB і ряд інших. Звичайно, при цьому не всі специфічні для реляційних баз даних особливості специфікації переносяться на бази nosql повністю.
4. У чому відмінність JPA від JDO?
JPA (Java Persistence API) та Java Data Objects (JDO) дві специфікації збереження java об'єктів у базах даних. Якщо JPA сконцентрована лише на реляційних базах, то JDO загальнішаспецифікація яка описує ORM для будь-яких можливих баз та сховищ. В принципі можна розглядати JPA як спеціалізовану на реляційних баз частина специфікації JDO, навіть при тому, що API цих двох специфікацій не повністю збігається. Також відрізняються «розробники» специфікацій — якщо JPA розробляється як JSR, то JDO розроблявся спочатку як JSR, тепер розробляється як проект Apache JDO.
5. Що таке Entity?
Entity це легковажний об'єкт бізнес логіки, що зберігається (persistent domain object). Основна програмна сутність це entity клас, який також може використовувати додаткові класи, які можуть використовуватися як допоміжні класи або для збереження стану еntity.