JPA » История » Версия 9
Александр Александров, 04.05.2019 13:45
1 | 1 | Александр Александров | h1. JPA |
---|---|---|---|
2 | |||
3 | h2. Вопросы |
||
4 | |||
5 | # Что такое JPA? |
||
6 | # Из чего состоит JPA? |
||
7 | # В чем её отличие JPA от Hibernate? |
||
8 | # В чем её отличие JPA от JDO? |
||
9 | # Можно ли использовать JPA c noSQL базами? |
||
10 | # Что такое JPQL (Java Persistence query language) и чем он отличается от SQL? |
||
11 | # Что означает полиморфизм (polymorphism) в запросах JPQL (Java Persistence query language) и как его «выключить»? |
||
12 | # Что такое Criteria API и для чего он используется? |
||
13 | # Что такое Entity? |
||
14 | # Может ли не Entity класс наследоваться от Entity класса? |
||
15 | # Может ли Entity класс наследоваться от других Entity классов? |
||
16 | # Может ли Entity быть абстрактным классом? |
||
17 | # Может ли Entity класс наследоваться от не Entity классов (non-entity classes)? |
||
18 | # Какие требования JPA к Entity классам вы можете перечислить (не менее шести требований)? |
||
19 | # Что такое атрибут Entity класса в терминологии JPA? |
||
20 | # Какие два типа элементов есть у Entity классов. Или другими словами перечислите два типа доступа (access) к элементам Entity классов. |
||
21 | # Какие типы данных допустимы в атрибутах Entity класса (полях или свойствах)? |
||
22 | 2 | Александр Александров | # Какие типы данных можно использовать в атрибутах, входящих в первичный ключ Entity класса (составной или простой), чтобы полученный первичный ключ мог использоваться для любой базы данных? А в случае автогенерируемого первичного ключа (generated primary keys)? |
23 | 1 | Александр Александров | # Что такое встраиваемый (Embeddable) класс? |
24 | # Может ли встраиваемый (Embeddable) класс содержать другой встраиваемый (Embeddable) класс? |
||
25 | # Может ли встраиваемый (Embeddable) класс содержать связи (relationship) с другими Entity или коллекциями Entity? Если может, то существуют ли какие-то ограничение на такие связи (relationship)? |
||
26 | # Какие требования JPA устанавливает к встраиваемым (Embeddable) классам? |
||
27 | # Какие типы связей (relationship) между Entity вы знаете (перечислите восемь типов, либо укажите четыре типа связей, каждую из которых можно разделить ещё на два вида)? |
||
28 | # Что такое Mapped Superclass? |
||
29 | # Какие два типа fetch стратегии в JPA вы знаете? |
||
30 | # Какие три типы стратегии наследования мапинга (Inheritance Mapping Strategies) описаны в JPA? |
||
31 | # Что такое EntityManager и какие основные его функции вы можете перечислить? |
||
32 | # Какие четыре статуса жизненного цикла Entity объекта (Entity Instance’s Life Cycle) вы можете перечислить? |
||
33 | # Как влияет операция merge на Entity объекты каждого из четырех статусов? |
||
34 | # Как влияет операция remove на Entity объекты каждого из четырех статусов? |
||
35 | # Как влияет операция persist на Entity объекты каждого из четырех статусов? |
||
36 | # Как влияет операция refresh на Entity объекты каждого из четырех статусов? |
||
37 | # Как влияет операция detach на Entity объекты каждого из четырех статусов? |
||
38 | # Для чего нужна аннотация Access? |
||
39 | # Для чего нужна аннотация Basic? |
||
40 | # Какой аннотациями можно перекрыть связи (override entity relationship) или атрибуты, унаследованные от суперкласса, или заданные в embeddable классе при использовании этого embeddable класса в одном из entity классов и не перекрывать в остальных? |
||
41 | # Какие аннотации служит для задания класса преобразования basic атрибута Entity в другой тип при сохранении/получении данных их базы (например, работать с атрибутом Entity boolean типа, но в базу сохранять его как число)? |
||
42 | # Какой аннотацией можно управлять кешированием JPA для данного Entity? |
||
43 | # Какой аннотацией можно задать класс, методы которого должен выполнится при определенных JPA операциях над данным Enitity или Mapped Superclass (такие как удаление, изменение данных и т.п.)? |
||
44 | # Для чего нужны callback методы в JPA? К каким сущностям применяются аннотации callback методов? Перечислите семь callback методов (или что тоже самое аннотаций callback методов). |
||
45 | # Какой аннотацей можно исключить поли и свойства Entity из маппинга (property or field is not persistent)? |
||
46 | # Какие аннотации служить для установки порядка выдачи элементов коллекций Entity? |
||
47 | # Какие шесть видов блокировок (lock) описаны в спецификации JPA (или какие есть значения у enum LockModeType в JPA)? |
||
48 | # Какие два вида кэшей (cache) вы знаете в JPA и для чего они нужны? |
||
49 | # Какие есть варианты настройки second-level cache (кэша второго уровня) в JPA или что аналогично опишите какие значения может принимать элемент shared-cachemode из persistence.xml? |
||
50 | # Как можно изменить настройки fetch стратегии любых атрибутов Entity для отдельных запросов (query) или методов поиска (Ùnd), то если у Enity есть атрибут с fetchType = LAZY, но для конкретного запроса его требуется сделать EAGER или наоборот? |
||
51 | # Каким способом можно получить метаданные JPA (сведения о Entity типах, Embeddable и Managed классах и т.п.)? |
||
52 | # Каким способом можно в коде работать с кэшем второго уровня (удалять все или определенные Entity из кеша, узнать закэшировался ли данное Entity и т.п.)? |
||
53 | # В чем разница в требованиях к Entity в Hibernate, от требований к Entity, указанных в спецификации JPA (см. вопрос 10)? |
||
54 | # Какая уникальная стратегия наследования есть в Hibernate, но нет в спецификации JPA? |
||
55 | # Какие основные новые возможности появились в спецификации JPA 2.1 по сравнению с JPA 2.0 (перечислите хотя бы пять-шесть новых возможностей)? |
||
56 | |||
57 | h2. Ответы |
||
58 | |||
59 | h3. Что такое JPA? |
||
60 | |||
61 | 2 | Александр Александров | JPA - это технология, обеспечивающая объектно-реляционное отображение простых JAVA объектов и предоставляющая API для сохранения, получения и управления такими объектами. |
62 | |||
63 | JPA - это спецификация (документ, утвержденный как стандарт, описывающий все аспекты технологии), часть EJB3 спецификации. Сам JPA не умеет ни сохранять, ни управлять объектами, JPA только определяет правила игры: как что-то будет действовать. JPA также определяет интерфейсы, которые должны будут быть реализованы провайдерами. Плюс к этому JPA определяет правила о том, как должны описываться метаданные отображения и о том, как должны работать провайдеры. Дальше, каждый провайдер, реализуя JPA определяет получение, сохранение и управление объектами. У каждого провайдера реализация разная. |
||
64 | |||
65 | Реализации JPA: |
||
66 | |||
67 | * Hibernate |
||
68 | * Oracle TopLink |
||
69 | * Apache OpenJPA |
||
70 | |||
71 | 1 | Александр Александров | h3. Из чего состоит JPA? |
72 | |||
73 | 2 | Александр Александров | JPA состоит из трех основных пунктов: |
74 | |||
75 | * API - интерфейсы в пакете javax.persistance. Набор интерфейсов, которые позволяют организовать взаимодействие с ORM провайдером. |
||
76 | * JPQL - объектный язык запросов. Очень похож на SQL, но запросы выполняются к объектам. |
||
77 | * Metadata - аннотации над объектами. Набор аннотаций, которыми мы описываем метаданные отображения. Тогда уже JPA знает какой объект в какую таблицу нужно сохранить. Метаданные можно описывать двумя способами: XML-файлом или через аннотации. |
||
78 | |||
79 | 1 | Александр Александров | h3. В чем её отличие JPA от Hibernate? |
80 | |||
81 | 2 | Александр Александров | Hibernate одна из самых популярных открытых реализаций последней версии спецификации (JPA 2.1). То есть JPA только описывает правила и API, а Hibernate реализует эти описания, впрочем у Hibernate (как и у многих других реализаций JPA) есть дополнительные возможности, не описанные в JPA (и не переносимые на другие реализации JPA). |
82 | |||
83 | 1 | Александр Александров | h3. В чем её отличие JPA от JDO? |
84 | |||
85 | 2 | Александр Александров | JPA (Java Persistence API) и Java Data Objects (JDO) две спецификации сохранения java объектов в базах данных. Если JPA сконцентрирована только на реляционных базах, то JDO более общая спецификация которая описывает ORM для любых возможных баз и хранилищ. Также отличаются "разработчики" спецификаций - если JPA разрабатывается как JSR, то JDO сначала разрабатывался как JSR, теперь разрабатывается как проект Apache JDO. |
86 | |||
87 | 1 | Александр Александров | h3. Можно ли использовать JPA c noSQL базами? |
88 | |||
89 | 2 | Александр Александров | Спецификация JPA говорит только о отображении java объектов в таблицы реляционных баз данных, но при этом существует ряд реализаций данного стандарта для noSql баз данных: Kundera, DataNucleus, ObjectDB и ряд других. Естественно, при это не все специфичные для реляционных баз данных особенности спецификации переносятся при этом на nosql базы полностью. |
90 | |||
91 | 1 | Александр Александров | h3. Что такое JPQL (Java Persistence query language) и чем он отличается от SQL? |
92 | |||
93 | 2 | Александр Александров | JPQL (Java Persistence query language) это язык запросов, практически такой же как SQL, однако вместо имен и колонок таблиц базы данных, он использует имена классов Entity и их атрибуты. В качестве параметров запросов так же используются типы данных атрибутов Entity, а не полей баз данных. В отличии от SQL в JPQL есть автоматический полиморфизм. Также в JPQL используется функции которых нет в SQL: такие как KEY (ключ Map’ы), VALUE (значение Map’ы), TREAT (для приведение суперкласса к его объекту-наследнику, downcasting), ENTRY и т.п. |
94 | |||
95 | 1 | Александр Александров | h3. Что означает полиморфизм (polymorphism) в запросах JPQL (Java Persistence query language) и как его «выключить»? |
96 | |||
97 | 2 | Александр Александров | В отличии от SQL в запросах JPQL есть автоматический полиморфизм, то есть каждый запрос к Entity возвращает не только объекты этого Entity, но так же объекты всех его классов-потомков, независимо от стратегии наследования (например, запрос *select * from Animal* , вернет не только объекты Animal, но и объекты классов Cat и Dog, которые унаследованы от Animal). Чтобы исключить такое поведение используется функция TYPE в where условии (например select * from Animal a where TYPE(a) IN (Animal, Cat) уже не вернет объекты класса Dog) |
98 | |||
99 | 1 | Александр Александров | h3. Что такое Criteria API и для чего он используется? |
100 | |||
101 | 2 | Александр Александров | Criteria API это тоже язык запросов, аналогичным JPQL (Java Persistence query language), однако запросы основаны на методах и объектах, то есть запросы выглядят так: |
102 | |||
103 | {{dmsf_image(319)}} |
||
104 | |||
105 | 1 | Александр Александров | h3. Что такое Entity? |
106 | |||
107 | 2 | Александр Александров | Entity это легковесный хранимый объект бизнес логики (persistent domain object). Основная программная сущность это entity класс, который так же может использовать дополнительные классы, который могут использоваться как вспомогательные классы или для сохранения состояния еntity. |
108 | |||
109 | 1 | Александр Александров | h3. Может ли не Entity класс наследоваться от Entity класса? |
110 | |||
111 | 2 | Александр Александров | Может. |
112 | |||
113 | 1 | Александр Александров | h3. Может ли Entity класс наследоваться от других Entity классов? |
114 | |||
115 | 2 | Александр Александров | Может. |
116 | |||
117 | 1 | Александр Александров | h3. Может ли Entity быть абстрактным классом? |
118 | |||
119 | 2 | Александр Александров | Может, при этом он сохраняет все свойства Entity, за исключением того что его нельзя непосредственно инициализировать. |
120 | |||
121 | 1 | Александр Александров | h3. Может ли Entity класс наследоваться от не Entity классов (non-entity classes)? |
122 | |||
123 | 2 | Александр Александров | Может. |
124 | |||
125 | 1 | Александр Александров | h3. Какие требования JPA к Entity классам вы можете перечислить (не менее шести требований)? |
126 | |||
127 | 2 | Александр Александров | # Entity класс должен быть отмечен аннотацией Entity или описан в XML файле конфигурации JPA. |
128 | # Entity класс должен содержать public или protected конструктор без аргументов (он также может иметь конструкторы с аргументами). |
||
129 | # Entity класс должен быть классом верхнего уровня (top-level class). |
||
130 | # Entity класс не может быть enum или интерфейсом. |
||
131 | 3 | Александр Александров | # Entity класс не может быть финальным классом (Final class). |
132 | # Entity класс не может содержать финальные поля или методы, если они участвуют в маппинге (persistent final methods or persistent final instance variables). |
||
133 | 2 | Александр Александров | # Если объект Entity класса будет передаваться по значению как отдельный объект (detached object), например через удаленный интерфейс (through a remote interface), он так же должен реализовывать Serializable интерфейс. |
134 | # Поля Entity класс должны быть напрямую доступны только методам самого Entity класса и не должны быть напрямую доступны другим классам, использующим этот Entity. Такие классы должны обращаться только к методам (getter/setter методам или другим методам бизнес-логики в Entity классе). |
||
135 | # Enity класс должен содержать первичный ключ, то есть атрибут или группу атрибутов которые уникально определяют запись этого Enity класса в базе данных. |
||
136 | |||
137 | 1 | Александр Александров | h3. Что такое атрибут Entity класса в терминологии JPA? |
138 | |||
139 | 4 | Александр Александров | JPA указывает что она может работать как с свойствами классов (property), оформленные в стиле JavaBeans, либо с полями (field), то есть переменными класса (instance variables). Оба типа элементов Entity класса называются атрибутами Entity класса. |
140 | 2 | Александр Александров | |
141 | 1 | Александр Александров | h3. Какие два типа элементов есть у Entity классов. Или другими словами перечислите два типа доступа (access) к элементам Entity классов. |
142 | |||
143 | 2 | Александр Александров | JPA указывает что она может работать как с свойствами классов (property), оформленные в стиле JavaBeans, либо с полями (Ùeld), то есть переменными класса (instance variables). Соответственно, при этом тип доступа будет либо property access или field access. |
144 | |||
145 | 1 | Александр Александров | h3. Какие типы данных допустимы в атрибутах Entity класса (полях или свойствах)? |
146 | |||
147 | 2 | Александр Александров | Допустимые типы атрибутов у Entity классов: |
148 | 1 | Александр Александров | |
149 | 2 | Александр Александров | # примитивные типы и их обертки Java, |
150 | # строки, |
||
151 | # любые сериализуемые типы Java (реализующие Serializable интерфейс), |
||
152 | # enums; |
||
153 | # entity types; |
||
154 | # embeddable классы |
||
155 | # и коллекции типов 1-6 |
||
156 | 1 | Александр Александров | |
157 | 2 | Александр Александров | h3. Какие типы данных можно использовать в атрибутах, входящих в первичный ключ Entity класса (составной или простой), чтобы полученный первичный ключ мог использоваться для любой базы данных? А в случае автогенерируемого первичного ключа (generated primary keys)? |
158 | |||
159 | Допустимые типы атрибутов, входящих в первичный ключ: |
||
160 | |||
161 | # примитивные типы и их обертки Java; |
||
162 | # строки; |
||
163 | # BigDecimal и BigInteger; |
||
164 | # java.util.Date и java.sql.Date,В случае автогенерируемого первичного ключа (generated primary keys) допустимы только числовые типы,В случае использования других типов данных в первичном ключе, он может работать только для некоторых баз данных, т.е. становится не переносимым (not portable). |
||
165 | |||
166 | 1 | Александр Александров | h3. Что такое встраиваемый (Embeddable) класс? |
167 | |||
168 | 2 | Александр Александров | Встраиваемый (Embeddable) класс это класс который не используется сам по себе, только как часть одного или нескольких Entity классов. Entity класс могут содержать как одиночные встраиваемые классы, так и коллекции таких классов. Также такие классы могут быть использованы как ключи или значения map. Во время выполнения каждый встраиваемый класс принадлежит только одному объекту Entity класса и не может быть использован для передачи данных между объектами Entity классов (то есть такой класс не является общей структурой данных для разных объектов). В целом, такой класс служит для того чтобы выносить определение общих атрибутов для нескольких Entity, можно считать что JPA просто встраивает в Entity вместо объекта такого класса те атрибуты, которые он содержит. |
169 | |||
170 | 1 | Александр Александров | h3. Может ли встраиваемый (Embeddable) класс содержать другой встраиваемый (Embeddable) класс? |
171 | |||
172 | 2 | Александр Александров | Да, может. |
173 | |||
174 | 1 | Александр Александров | h3. Может ли встраиваемый (Embeddable) класс содержать связи (relationship) с другими Entity или коллекциями Entity? Если может, то существуют ли какие-то ограничение на такие связи (relationship)? |
175 | |||
176 | 2 | Александр Александров | Может, но только в случае если такой класс не используется как первичный ключ или ключ map’ы |
177 | |||
178 | 1 | Александр Александров | h3. Какие требования JPA устанавливает к встраиваемым (Embeddable) классам? |
179 | |||
180 | 2 | Александр Александров | # Такие классы должны удовлетворять тем же правилам что Entity классы, за исключением того что они не обязаны содержать первичный ключ и быть отмечены аннотацией Entity. |
181 | # Embeddable класс должен быть отмечен аннотацией Embeddable или описан в XML файле конфигурации JPA. |
||
182 | |||
183 | 1 | Александр Александров | h3. Какие типы связей (relationship) между Entity вы знаете (перечислите восемь типов, либо укажите четыре типа связей, каждую из которых можно разделить ещё на два вида)? |
184 | |||
185 | 2 | Александр Александров | Существуют следующие четыре типа связей |
186 | |||
187 | * OneToOne (связь один к одному, то есть один объект Entity может связан не больше чем с один объектом другого Entity ); |
||
188 | * OneToMany (связь один ко многим, один объект Entity может быть связан с целой коллекцией других Entity); |
||
189 | * ManyToOne (связь многие к одному, обратная связь для OneToMany); |
||
190 | * ManyToMany (связь многие ко многим). |
||
191 | |||
192 | Каждую из которых можно разделить ещё на два вида: |
||
193 | |||
194 | *Bidirectional - ссылка на связь устанавливается у всех Entity, то есть в случае OneToOne A-B в Entity A есть ссылка на Entity B, в Entity B есть ссылка на Entity A, Entity A считается владельцем этой связи (это важно для случаев каскадного удаления данных, тогда при удалении A также будет удалено B, но не наоборот). |
||
195 | *Undirectional - ссылка на связь устанавливается только с одной стороны, то есть в случае OneToOne A-B только у Entity A будет ссылка на Entity B, у Entity B ссылки на A не будет. |
||
196 | |||
197 | 1 | Александр Александров | h3. Что такое Mapped Superclass? |
198 | |||
199 | 2 | Александр Александров | Mapped Superclass это класс от которого наследуются Entity, он может содержать аннотации JPA, однако сам такой класс не является Entity, ему не обязательно выполнять все требования установленные для Entity (например, он может не |
200 | содержать первичного ключа). Такой класс не может использоваться в операциях EntityManager или Query. Такой класс должен быть отмечен аннотацией MappedSuperclass или соответственно описан в xml файле. |
||
201 | |||
202 | 1 | Александр Александров | h3. Какие два типа fetch стратегии в JPA вы знаете? |
203 | |||
204 | 2 | Александр Александров | В JPA описаны два типа fetch стратегии: |
205 | |||
206 | * LAZY - данные поля будут загружены только во время первого доступа к этому полю, |
||
207 | * EAGER - данные поля будут загружены немедленно. |
||
208 | |||
209 | 1 | Александр Александров | h3. Какие три типы стратегии наследования мапинга (Inheritance Mapping Strategies) описаны в JPA? |
210 | |||
211 | 2 | Александр Александров | В JPA описаны три стратегии наследования мапинга (Inheritance Mapping Strategies), то есть как JPA будет работать с классами-наследниками Entity: |
212 | |||
213 | * одна таблица на всю иерархию наследования (a single table per class hierarchy) - все enity, со всеми наследниками записываются в одну таблицу, для идентификации типа entity определяется специальная колонка "discriminator column". Например, если есть entity Animals c классами-потомками Cats и Dogs, при такой стратегии все entity записываются в таблицу Animals, но при это имеют дополнительную колонку animalType в которую соответственно пишется значение "cat" или "dog".Минусом является то что в общей таблице, будут созданы все поля уникальные для каждого из классов-потомков, которые будет пусты для всех других классов-потомков. Например, в таблице animals окажется и скорость лазанья по дереву от cats и может ли пес приносить тапки от dogs, которые будут всегда иметь null для dog и cat соответственно. |
||
214 | * объединяющая стратегия (joined subclass strategy) - в этой стратегии каждый класс enity сохраняет данные в свою таблицу, но только уникальные колонки (не унаследованные от классов-предков) и первичный ключ, а все унаследованные колонки записываются в таблицы класса-предка, дополнительно устанавливается связь (relationships) между этими таблицами, например в случае классов Animals (см.выше), будут три таблицы animals, cats, dogs, причем в cats будет записана только ключ и скорость лазанья, в dogs - ключ и умеет ли пес приносить палку, а в animals все остальные данные cats и dogs c ссылкой на соответствующие таблицы. Минусом тут являются потери производительности от объединения таблиц (join) для любых операций. |
||
215 | * одна таблица для каждого класса (table per concrete class strategy) - тут все просто каждый отдельный класс-наследник имеет свою таблицу, т.е. для cats и dogs все данные будут записываться просто в таблицы cats и dogs как если бы они вообще не имели общего суперкласса. Минусом является плохая поддержка полиморфизма (polymorphic relationships) и то что для выборки всех классов иерархии потребуются большое количество отдельных sql запросов или использование UNION запроса. |
||
216 | |||
217 | 1 | Александр Александров | h3. Что такое EntityManager и какие основные его функции вы можете перечислить? |
218 | |||
219 | 2 | Александр Александров | EntityManager это интерфейс, который описывает API для всех основных операций над Enitity, получение данных и других сущностей JPA. По сути главный API для работы с JPA. Основные операции: |
220 | |||
221 | * Для операций над Entity: persist (добавление Entity под управление JPA), merge (обновление), remove (удаления), refresh (обновление данных), detach (удаление из управление JPA), lock (блокирование Enity от изменений в других thread); |
||
222 | * Получение данных: find (поиск и получение Entity), createQuery, createNamedQuery, createNativeQuery, contains, createNamedStoredProcedureQuery, createStoredProcedureQuery; |
||
223 | * Получение других сущностей JPA: getTransaction, getEntityManagerFactory, getCriteriaBuilder, getMetamodel, getDelegate Работа с EntityGraph: createEntityGraph, getEntityGraph; |
||
224 | * Общие операции над EntityManager или всеми Entities: close, isOpen, getProperties, setProperty, clear. |
||
225 | |||
226 | 1 | Александр Александров | h3. Какие четыре статуса жизненного цикла Entity объекта (Entity Instance’s Life Cycle) вы можете перечислить? |
227 | |||
228 | 2 | Александр Александров | У Entity объекта существует четыре статуса жизненного цикла: new, managed, |
229 | detached, или removed. Их описание: |
||
230 | |||
231 | * new - объект создан, но при этом ещё не имеет сгенерированных первичных ключей и пока ещё не сохранен в базе данных; |
||
232 | * managed - объект создан, управляется JPA, имеет сгенерированные первичные ключи; |
||
233 | * detached - объект был создан, но не управляется (или больше не управляется) JPA; |
||
234 | * removed - объект создан, управляется JPA, но будет удален после commit’a транзакции. |
||
235 | |||
236 | 1 | Александр Александров | h3. Как влияет операция merge на Entity объекты каждого из четырех статусов? |
237 | |||
238 | 2 | Александр Александров | # Если статус detached, то либо данные будет скопированы в существующей managed entity с тем же первичным ключом, либо создан новый managed в который скопируются данные; |
239 | # Если статус Entity new, то будет создана новый managed entity, в который будут скопированы данные прошлого объекта; |
||
240 | # Если статус managed, операция игнорируется, однако операция merge сработает на каскадно зависимые Entity, если их статус не managed; |
||
241 | # Если статус removed, будет выкинут exception сразу или на этапе commit’а транзакции. |
||
242 | |||
243 | 1 | Александр Александров | h3. Как влияет операция remove на Entity объекты каждого из четырех статусов? |
244 | |||
245 | 2 | Александр Александров | # Если статус Entity new, операция игнорируется, однако зависимые Entity могут поменять статус на removed, если у них есть аннотации каскадных изменений и они имели статус managed; |
246 | # Если статус managed, то статус меняется на removed и запись объект в базе данных будет удалена при commit’е транзакции (так же произойдут операции remove для всех каскадно зависимых объектов); |
||
247 | # Если статус removed, то операция игнорируется; |
||
248 | # Если статус detached, будет выкинут exception сразу или на этапе commit’а транзакции. |
||
249 | |||
250 | 1 | Александр Александров | h3. Как влияет операция persist на Entity объекты каждого из четырех статусов? |
251 | |||
252 | 2 | Александр Александров | # Если статус Entity new, то он меняется на managed и объект будет сохранен в базу при commit’е транзакции или в результате flush операций; |
253 | # Если статус уже managed, операция игнорируется, однако зависимые Entity могут поменять статус на managed, если у них есть аннотации каскадных изменений; |
||
254 | # Если статус removed, то он меняется на managed; |
||
255 | # Если статус detached, будет выкинут exception сразу или на этапе commit’а транзакции. |
||
256 | |||
257 | 1 | Александр Александров | h3. Как влияет операция refresh на Entity объекты каждого из четырех статусов? |
258 | |||
259 | 2 | Александр Александров | # Если статус Entity managed, то в результате операции будут востановленны все изменения из базы данных данного Entity, так же произойдет refresh всех каскадно зависимых объектов; |
260 | # Если статус new, removed или detached, будет выкинут exception. |
||
261 | |||
262 | 1 | Александр Александров | h3. Как влияет операция detach на Entity объекты каждого из четырех статусов? |
263 | |||
264 | 2 | Александр Александров | # Если статус Entity managed или removed, то в результате операции статус Entity (и всех каскадно-зависимых объектов) станет detached. |
265 | # Если статус new или detached, то операция игнорируется. |
||
266 | |||
267 | 1 | Александр Александров | h3. Для чего нужна аннотация Access? |
268 | |||
269 | 2 | Александр Александров | Она определяет тип доступа (access type) для класса entity, суперкласса, embeddable или отдельных атрибутов, то есть как JPA будет обращаться к атрибутам entity, как к полям класса (FIELD) или как к свойствам класса (PROPERTY), имеющие гетеры (getter) и сетеры (setter). |
270 | |||
271 | 1 | Александр Александров | h3. Для чего нужна аннотация Basic? |
272 | |||
273 | 2 | Александр Александров | Basic - указывает на простейший тип маппинга данных на колонку таблицы базы данных. Также в параметрах аннотации можно указать fetch стратегию доступа к полю и является ли это поле обязательным или нет. |
274 | |||
275 | 1 | Александр Александров | h3. Какой аннотациями можно перекрыть связи (override entity relationship) или атрибуты, унаследованные от суперкласса, или заданные в embeddable классе при использовании этого embeddable класса в одном из entity классов и не перекрывать в остальных? |
276 | |||
277 | 2 | Александр Александров | Для такого перекрывания существует четыре аннотации: |
278 | * AttributeOverride чтобы перекрыть поля, свойства и первичные ключи; |
||
279 | * AssociationOverride чтобы перекрывать связи (override entity relationship); |
||
280 | * AssociationOverrides чтобы перекрывать множественные связи (multiple relationship). |
||
281 | |||
282 | 5 | Александр Александров | h3. Какие аннотации служит для задания класса преобразования basic атрибута Entity в другой тип при сохранении/получении данных из базы (например, работать с атрибутом Entity boolean типа, но в базу сохранять его как число)? |
283 | 1 | Александр Александров | |
284 | 2 | Александр Александров | Convert и Converts - позволяют указать класс для конвертации Basic атрибута Entity в другой тип (Converts - позволяют указать несколько классов конвертации). Классы для конвертации должны реализовать интерфейс AttributeConverter и могут быть отмечены (но это не обязательно) аннотацией Converter. |
285 | |||
286 | 1 | Александр Александров | h3. Какой аннотацией можно управлять кешированием JPA для данного Entity? |
287 | |||
288 | 2 | Александр Александров | Cacheable - позволяет включить или выключить использование кеша второго уровня (second-level cache) для данного Entity (если провайдер JPA поддерживает работу с кешированием и настройки кеша (second-level cache) стоят как ENABLE_SELECTIVE или DISABLE_SELECTIVE, см вопрос 41). Обратите внимание свойство наследуется и если не будет перекрыто у наследников, то кеширование измениться и для них тоже. |
289 | |||
290 | 1 | Александр Александров | h3. Какой аннотацией можно задать класс, методы которого должен выполнится при определенных JPA операциях над данным Enitity или Mapped Superclass (такие как удаление, изменение |
291 | данных и т.п.)? |
||
292 | |||
293 | 2 | Александр Александров | Аннотация EntityListeners позволяет задать класс Listener, который будет содержать методы обработки событий (сallback methods) определенных Entity или Mapped Superclass. |
294 | |||
295 | 1 | Александр Александров | h3. Для чего нужны callback методы в JPA? К каким сущностям применяются аннотации callback методов? Перечислите семь callback методов (или что тоже самое аннотаций callback методов). |
296 | |||
297 | 2 | Александр Александров | Callback методы служат для вызова при определенных событиях Entity (то есть добавить обработку например удаления Entity методами JPA), могут быть добавлены к entity классу, к mapped superclass, или к callback listener классу, заданному аннотацией EntityListeners (см предыдущий вопрос). Существует семь callback методов (и аннотаций с теми же именами): |
298 | |||
299 | * PrePersist |
||
300 | * PostPersist |
||
301 | * PreRemove |
||
302 | * PostRemove |
||
303 | * PreUpdate |
||
304 | * PostUpdate |
||
305 | * PostLoad |
||
306 | |||
307 | 6 | Александр Александров | h3. Какой аннотацией можно исключить поля и свойства Entity из маппинга (property or field is not persistent)? |
308 | 1 | Александр Александров | |
309 | 2 | Александр Александров | Для этого служит аннотация Transient. |
310 | |||
311 | 1 | Александр Александров | h3. Какие аннотации служить для установки порядка выдачи элементов коллекций Entity? |
312 | |||
313 | 2 | Александр Александров | Для этого служит аннотация OrderBy и OrderColumn. |
314 | |||
315 | 1 | Александр Александров | h3. Какие шесть видов блокировок (lock) описаны в спецификации JPA (или какие есть значения у enum LockModeType в JPA)? |
316 | |||
317 | 2 | Александр Александров | У JPA есть шесть видов блокировок, перечислим их в порядке увеличения надежности (от самого ненадежного и быстрого, до самого надежного и медленного): |
318 | |||
319 | * NONE - без блокировки; |
||
320 | * OPTIMISTIC (или синоним READ, оставшийся от JPA 1) - оптимистическая блокировка; |
||
321 | * OPTIMISTIC_FORCE_INCREMENT (или синоним WRITE, оставшийся от JPA 1) - оптимистическая блокировка с принудительным увеличением поля версионности; |
||
322 | * PESSIMISTIC_READ - пессимистичная блокировка на чтение; |
||
323 | * PESSIMISTIC_WRITE - пессимистичная блокировка на запись (и чтение); |
||
324 | * PESSIMISTIC_FORCE_INCREMENT - пессимистичная блокировка на запись (и чтение) с принудительным увеличением поля версионности. |
||
325 | |||
326 | 1 | Александр Александров | h3. Какие два вида кэшей (cache) вы знаете в JPA и для чего они нужны? |
327 | |||
328 | 2 | Александр Александров | JPA говорит о двух видов кэшей (cache): |
329 | |||
330 | * first-level cache (кэш первого уровня) - кэширует данные одной транзакции; |
||
331 | * second-level cache (кэш второго уровня) - кэширует данные дольше чем одна транзакция. Провайдер JPA может, но не обязан реализовывать работу с кэшем второго уровня. Такой вид кэша позволяет сэкономить время доступа и улучшить производительность, однако оборотной стороной является возможность получить устаревшие данные. |
||
332 | |||
333 | 1 | Александр Александров | h3. Какие есть варианты настройки second-level cache (кэша второго уровня) в JPA или что аналогично опишите какие значения может принимать элемент shared-cachemode из persistence.xml? |
334 | |||
335 | 2 | Александр Александров | JPA говорит о пяти значениях shared-cache-mode из persistence.xml, который определяет как будет использоваться second-level cache: |
336 | |||
337 | * ALL - все Entity могут кэшироваться в кеше второго уровня; |
||
338 | * NONE - кеширование отключено для всех Entity; |
||
339 | * ENABLE_SELECTIVE - кэширование работает только для тех Entity, у которых установлена аннотация Cacheable(true) или её xml эквивалент, для всех остальных кэширование отключено; |
||
340 | * DISABLE_SELECTIVE - кэширование работает для всех Entity, за исключением тех у которых установлена аннотация Cacheable(false) или её xml эквивалент; |
||
341 | * UNSPECIFIED - кеширование не определенно, каждый провайдер JPA использует свою значение по умолчанию для кэширования. |
||
342 | |||
343 | 9 | Александр Александров | h3. Как можно изменить настройки fetch стратегии любых атрибутов Entity для отдельных запросов (query) или методов поиска (find), то есть у Enity есть атрибут с fetchType = LAZY, но для конкретного запроса его требуется сделать EAGER или наоборот? |
344 | 1 | Александр Александров | |
345 | 2 | Александр Александров | Для этого существует EntityGraph API, используется он так: с помощью аннотации NamedEntityGraph для Entity, создаются именованные EntityGraph объекты, которые содержат список атрибутов у которых нужно поменять fetchType на EAGER, а потом данное имя указывается в hits запросов или метода Ùnd. В результате fetchType атрибутов Entity меняется, но только для этого запроса. Существует две стандартных property для указания EntityGraph в hit: |
346 | |||
347 | * javax.persistence.fetchgraph - все атрибуты перечисленные в EntityGraph меняют fetchType на EAGER, все остальные на LAZY; |
||
348 | * javax.persistence.loadgraph - все атрибуты перечисленные в EntityGraph меняют fetchType на EAGER, все остальные сохраняют свой fetchType (то есть если у атрибута, не указанного в EntityGraph, fetchType был EAGER, то он и останется EAGER)С помощью NamedSubgraph можно также изменить fetchType вложенных объектов Entity. |
||
349 | |||
350 | 1 | Александр Александров | h3. Каким способом можно получить метаданные JPA (сведения о Entity типах, Embeddable и Managed классах и т.п.)? |
351 | |||
352 | 2 | Александр Александров | Для получения такой информации в JPA используется интерфейс Metamodel. Объект этого интерфейса можно получить методом getMetamodel у EntityManagerFactory или EntityManager. |
353 | |||
354 | 1 | Александр Александров | h3. Каким способом можно в коде работать с кэшем второго уровня (удалять все или определенные Entity из кеша, узнать закэшировался ли данное Entity и т.п.)? |
355 | |||
356 | 2 | Александр Александров | Для работы с кэшем второго уровня (second level cache) в JPA описан Cache интерфейс, содержащий большое количество методов по управлению кэшем второго уровня (second level cache), если он поддерживается провайдером JPA, конечно. Объект данного интерфейса можно получить с помощью метода getCache у EntityManagerFactory. |
357 | 1 | Александр Александров | |
358 | 2 | Александр Александров | h3. В чем разница в требованиях к Entity в Hibernate, от требований к Entity, указанных в спецификации JPA? |
359 | |||
360 | # Конструктор без аргументов не обязан быть public или protected, рекомендуется чтобы он был хотя бы package видимости, однако это только рекомендация, если настройки безопасности Java позволяют доступ к приватным полям, то он может быть приватным; |
||
361 | # JPA категорически требует не использовать Ùnal классы, Hibernate лишь рекомендует не использовать такие классы чтобы он мог создавать прокси для ленивой загрузки, однако позволяет либо выключить прокси Proxy(lazy=false), либо использовать в качестве прокси интерфейс, содержащий все методы маппинга для данного класса (аннотацией Proxy(proxyClass=интерфейс.class)). |
||
362 | |||
363 | 1 | Александр Александров | h3. Какая уникальная стратегия наследования есть в Hibernate, но нет в спецификации JPA? |
364 | |||
365 | 2 | Александр Александров | В отличии JPA в Hibernate есть уникальная стратегия наследования, которая называется implicit polymorphism. |
366 | |||
367 | 1 | Александр Александров | h3. Какие основные новые возможности появились в спецификации JPA 2.1 по сравнению с JPA 2.0 (перечислите хотя бы пять-шесть новых возможностей)? |
368 | 2 | Александр Александров | |
369 | В спецификации JPA 2.1 появились: |
||
370 | |||
371 | * Entity Graphs - механизм динамического изменения fetchType для каждого запроса; |
||
372 | * Converters - механизм определения конвертеров для задания функций конвертации атрибутов Entity в поля базы данных; |
||
373 | * DDL генерация - автоматическая генерация таблиц, индексов и схем; |
||
374 | * Stored Procedures - механизм вызова хранимых процедур из JPA; |
||
375 | * Criteria Update/Delete - механизм вызова bulk updates или deletes, используя Criteria API; |
||
376 | * Unsynchronized persistence contexts - появление возможности указать SynchronizationType; |
||
377 | * Новые возможности в JPQL/Criteria API: арифметические подзапросы, generic database functions, join ON clause, функция TREAT; |
||
378 | * Динамическое создание именованных запросов (named queries); |
||
379 | * Интерфейс EntityManager получил новые методы createStoredProcedureQuery, isJoinedToTransaction и createQuery(CriteriaUpdate или CriteriaDelete); |
||
380 | * Абстрактный класс AbstractQuery стал наследоваться от класса CommonAbstractCriteria, появились новые интерфейсы CriteriaUpdate, CriteriaDelete унаследованные CommonAbstractCriteria; |
||
381 | * PersistenceProvider получил новые функции generateSchema позволяющие генерить схемы; |
||
382 | * EntityManagerFactory получил методы addNamedQuery, unwrap, addNamedEntityGraph, createEntityManager (с указанием SynchronizationType); |
||
383 | * Появился новый enum SynchronizationType, Entity Graphs, StoredProcedureQuery и AttributeConverter интерфейсы. |