• Shuffle
    Toggle On
    Toggle Off
  • Alphabetize
    Toggle On
    Toggle Off
  • Front First
    Toggle On
    Toggle Off
  • Both Sides
    Toggle On
    Toggle Off
  • Read
    Toggle On
    Toggle Off
Reading...
Front

Card Range To Study

through

image

Play button

image

Play button

image

Progress

1/42

Click to flip

Use LEFT and RIGHT arrow keys to navigate between flashcards;

Use UP and DOWN arrow keys to flip the card;

H to show hint;

A reads text to speech;

42 Cards in this Set

  • Front
  • Back

Что такое JPA?

JPA (Java Persistence API) это спецификация Java EE и Java SE, описывающая систему управления сохранением java объектов в таблицы реляционных баз данных в удобном виде.




Сама Java не содержит реализации JPA, однако есть существует много реализаций данной спецификации от разных компаний (открытых и нет). Это не единственный способ сохранения java объектов в базы данных (ORM систем), но один из самых популярных в Java мире.

В чем её отличие JPA от Hibernate?

Hibernate одна из самых популярных открытых реализаций последней версии спецификации (JPA 2.1). Даже скорее самая популярная, почти стандарт де-факто. То есть JPA только описывает правила и API, а Hibernate реализует эти описания, впрочем у Hibernate (как и у многих других реализаций JPA) есть дополнительные возможности, не описанные в JPA (и не переносимые на другие реализации JPA).

Можно ли использовать JPA c noSQl базами?

Вообще, спецификация JPA говорит только об отображении java объектов в таблицы реляционных баз данных, но при этом существует ряд реализаций данного стандарта для noSql баз данных: Kundera, DataNucleus, ObjectDB и ряд других. Естественно, при это не все специфичные для реляционных баз данных особенности спецификации переносятся при этом на nosql базы полностью.

В чем её отличие JPA от JDO?

JPA (Java Persistence API) и Java Data Objects (JDO) две спецификации сохранения java объектов в базах данных. Если JPA сконцентрирована только на реляционных базах, то JDO более общая спецификация которая описывает ORM для любых возможных баз и хранилищ.




В принципе можно рассматривать JPA как специализированную на релятивистских базах часть спецификации JDO, даже при том что API этих двух спецификаций не полностью совпадает.




Также отличаются «разработчики» спецификаций — если JPA разрабатывается как JSR, то JDO сначала разрабатывался как JSR, теперь разрабатывается как проект Apache JDO.

Что такое Entity?

Entity это легковесный хранимый объект бизнес логики (persistent domain object). Основная программная сущность это entity класс, который так же может использовать дополнительные классы, который могут использоваться как вспомогательные классы или для сохранения состояния еntity.

Может ли Entity класс наследоваться от других Entity классов? А от не Entity классов?

Entities may extend non-entity classes as well as entity classes…

Может ли Entity быть абстрактным классом?

An abstract class can be specified as an entity. An abstract entity differs from a concrete entity only in that it cannot be directly instantiated. An abstract entity is mapped as an entity and can be the target of queries (which will operate over and/or retrieve instances of its concrete subclasses).

Какие требования JPA к Entity классам вы можете перечислить (не менее шести требований)?

1) Entity класс должен быть отмечен аннотацией Entity или описан в XML файле конфигурации JPA,




2) Entity класс должен содержать public или protected конструктор без аргументов (он также может иметь конструкторы с аргументами),




3) Entity класс должен быть классом верхнего уровня (top-level class),




4) Entity класс не может быть enum или интерфейсом,




5) Entity класс не может быть финальным классом (final class),




6) Entity класс не может содержать финальные поля или методы, если они участвуют в маппинге (persistent final methods or persistent final instance variables),




7) Если объект Entity класса будет передаваться по значению как отдельный объект (detached object), например через удаленный интерфейс (through a remote interface), он так же должен реализовывать Serializable интерфейс,




8) Поля Entity класс должны быть напрямую доступны только методам самого Entity класса и не должны быть напрямую доступны другим классам, использующим этот Entity. Такие классы должны обращаться только к методам (getter/setter методам или другим методам бизнес-логики в Entity классе),




9) Enity класс должен содержать первичный ключ, то есть атрибут или группу атрибутов которые уникально определяют запись этого Enity класса в базе данных,

Какие два типа элементов есть у Entity классов? Или другими словами перечислите два типа доступа (access) к элементам Entity классов.


Что такое атрибут Entity класса в терминологии JPA?

The persistent state of an entity is accessed by the persistence provider runtime either via JavaBeans style property accessors (“property access”) or via instance variables (“field access”). Whether persistent properties or persistent fields or a combination of the two is used for the provider’s access to agiven class or entity hierarchy is determined.



Terminology Note: The persistent fields and properties of an entity class are generically referred to in this document as the “attributes” of the class.

Какие типы данных допустимы в атрибутах Entity класса (полях или свойствах)?

The persistent fields or properties of an entity may be of the following types:




1. Java primitive types;




2. java.lang.String;




3. other Java serializable types (including wrappers of the primitive types, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar[5], java.sql.Date, java.sql.Time, java.sql.Timestamp, byte[], Byte[], char[], Character[], and user-defined types that implement the Serializableinterface);




4. enums;




5. entity types;




6. collections of entity types;




7. embeddable classes;




8. collections of basic and embeddable types.

Какие типы данных можно использовать в атрибутах, входящих в первичный ключ Entity класса (составной или простой), чтобы полученный первичный ключ мог использоваться для любой базы данных? А в случае автогенерируемого первичного ключа (generated primary keys)?

Допустимые типы атрибутов, входящих в первичный ключ:


1. примитивные типы и их обертки Java,


2. строки,


3. BigDecimal и BigInteger,


4. java.util.Date и java.sql.Date,




В случае автогенерируемого первичного ключа (generated primary keys) допустимы


1. только числовые типы,




В случае использования других типов данных в первичном ключе, он может работать только для некоторых баз данных, т.е. становится не переносимым (not portable),

Что такое встраиваемый (Embeddable) класс?

Встраиваемый (Embeddable) класс это класс который не используется сам по себе, только как часть одного или нескольких Entity классов. Entity класс могут содержать как одиночные встраиваемые классы, так и коллекции таких классов. Также такие классы могут быть использованы как ключи или значения map. Во время выполнения каждый встраиваемый класс принадлежит только одному объекту Entity класса и не может быть использован для передачи данных между объектами Entity классов (то есть такой класс не является общей структурой данных для разных объектов). В целом, такой класс служит для того чтобы выносить определение общих атрибутов для нескольких Entity, можно считать что JPA просто встраивает в Entity вместо объекта такого класса те атрибуты, которые он содержит.

Может ли встраиваемый (Embeddable) класс содержать другой встраиваемый (Embeddable) класс?

An embeddable class may be used to represent the state of another embeddable class.An embeddable class (including an embeddable class within another embeddable class) may contain a collection of a basic type or other embeddable class.

Может ли встраиваемый (Embeddable) класс содержать связи (relationship) с другими Entity или коллекциями Entity? Если может, то существуют ли какие-то ограничение на такие связи (relationship)?

An embeddable class may contain a relationship to an entity or collection of entities. Since instances of embeddable classes themselves have no persistent identity, the relationship from the referenced entity is to the entity that contains the embeddable instance(s) and not to the embeddable itself. An embeddable class that is used as an embedded id or as a map key must not contain such a relationship.

Какие требования JPA устанавливает к встраиваемым (Embeddable) классам?

1. Такие классы должны удовлетворять тем же правилам что Entity классы, за исключением того что они не обязаны содержать первичный ключ и быть отмечены аннотацией Entity (см. вопрос 10),




2. Embeddable класс должен быть отмечен аннотацией Embeddable или описан в XML файле конфигурации JPA,

Какие типы связей (relationship) между Entity вы знаете (перечислите восемь типов, либо укажите четыре типа связей, каждую из которых можно разделить ещё на два вида)?

Существуют следующие четыре типа связей




1. OneToOne (связь один к одному, то есть один объект Entity может связан не больше чем с один объектом другого Entity ),




2. OneToMany (связь один ко многим, один объект Entity может быть связан с целой коллекцией других Entity),




3. ManyToOne (связь многие к одному, обратная связь для OneToMany),




4. ManyToMany (связь многие ко многим)




Каждую из которых можно разделить ещё на два вида:


1. Bidirectional


2. Unidirectional




Bidirectional — ссылка на связь устанавливается у всех Entity, то есть в случае OneToOne A-B в Entity A есть ссылка на Entity B, в Entity B есть ссылка на Entity A, Entity A считается владельцем этой связи (это важно для случаев каскадного удаления данных, тогда при удалении A также будет удалено B, но не наоборот).




Undirectional- ссылка на связь устанавливается только с одной стороны, то есть в случае OneToOne A-B только у Entity A будет ссылка на Entity B, у Entity B ссылки на A не будет.

Что такое Mapped Superclass?

An entity may inherit from a superclass that provides persistent entity state and mapping information, but which is not itself an entity. Typically, the purpose of such a mapped superclass is to define state and mapping information that is common to multiple entity classes. A mapped superclass, unlike an entity, is not queryable and must not be passed as an argument to EntityManager or Query operations. Persistent relationships defined by a mapped superclass must be unidirectional. Both abstract and concrete classes may be specified as mapped superclasses. The MappedSuperclass annotation (or mapped-superclass XML descriptor element) is used to designate a mapped superclass.




A class designated as a mapped superclass has no separate table defined for it. Its mapping informationis applied to the entities that inherit from it. A class designated as a mapped superclass can be mapped in the same way as an entity except that the mappings will apply only to its subclasses since no table exists for the mapped superclass itself. When applied to the subclasses, the inherited mappings will apply in the context of the subclass tables. Mapping information can be overridden in such subclasses by using the AttributeOverride andAssociationOverride annotations or corresponding XML elements.All other entity mapping defaults apply equally to a class designated as a mapped superclass.The following example illustrates the definition of a concrete class as a mapped superclass.

Какие типы стратегии наследования мапинга (Inheritance Mapping Strategies) описаны в JPA?

There are three basic strategies that are used when mapping a class or class hierarchy to a relationaldatabase:




• a single table per class hierarchy




• a joined subclass strategy, in which fields that are specific to a subclass are mapped to a separate table than the fields that are common to the parent class, and a join is performed to instantiatethe subclass.




• a table per concrete entity class

Describe atable per concrete class inheritance strategy?

Каждый отдельный класс-наследник имеет свою таблицу, т.е. для cats и dogs все данные будут записываться просто в таблицы cats и dogs, как если бы они вообще не имели общего суперкласса. Минусом является плохая поддержка полиморфизма и то, что для выборки всех классов иерархии потребуются большое количество отдельных sql запросов или использование UNION запроса.

Describe joined subclass inheritance strategy ?

В этой стратегии каждый класс enity сохраняет данные в свою таблицу, но только уникальные колонки (не унаследованные от классов-предков) и первичный ключ, а все унаследованные колонки записываются в таблицы класса-предка, дополнительно устанавливается связь (relationships) между этими таблицами, например в случае классов Animals (см.выше), будут три таблицы animals, cats, dogs, причем в cats будет записана только ключ и скорость лазанья, в dogs — ключ и умеет ли пес приносить палку, а в animals все остальные данные cats и dogs c ссылкой на соответствующие таблицы.Минусом тут являются потери производительности от объединения таблиц (join) для любых операций.

Describe a single table per class hierarchy inheritance strategy ?

Все enity, со всеми наследниками записываются в одну таблицу, для идентификации типа entity определяется специальная колонка “discriminator column”. Например, если есть entity Animals c классами-потомками Cats и Dogs, при такой стратегии все entity записываются в таблицу Animals, но при это имеют дополнительную колонку animalType в которую соответственно пишется значение «cat» или «dog». Минусом является то что в общей таблице, будут созданы все поля уникальные для каждого из классов-потомков, которые будет пусты для всех других классов-потомков. Например, в таблице animals окажется и скорость лазанья по дереву от cats и может ли пес приносить тапки от dogs, которые будут всегда иметь null для dog и cat соотвественно.

Какие два типа fetch стратегии в JPA вы знаете?

В JPA описаны два типа fetch стратегии:




1) LAZY — данные поля будут загруженны только во время первого доступа к этому полю,




2) EAGER — данные поля будут загруженны при загрузке объекта Entity,

Что такое EntityManager и какие основные его функции вы можете перечислить?

EntityManager это интерфейс, который описывает API для всех основных операций над Enitity, получение данных и других сущностей JPA. По сути главный API для работы с JPA. Основные операции:




1) Для операций над Entity: persist (добавление Entity под управление JPA), merge (обновление), remove (удаления), refresh (обновление данных), detach (удаление из управление JPA), lock (блокирование Enity от изменений в других thread),




2) Получение данных: find (поиск и получение Entity), createQuery, createNamedQuery, createNativeQuery, contains, createNamedStoredProcedureQuery, createStoredProcedureQuery




3) Получение других сущностей JPA: getTransaction, getEntityManagerFactory, getCriteriaBuilder, getMetamodel, getDelegate




4) Работа с EntityGraph: createEntityGraph, getEntityGraph




5) Общие операции над EntityManager или всеми Entities: close, isOpen, getProperties, setProperty, clear

Какие четыре статуса жизненного цикла Entity объекта (Entity Instance’s Life Cycle) вы можите перечислить?

У Entity объекта существует четыре статуса жизненного цикла: new, managed, detached, или removed. Их описание




1) new — объект создан, но при этом ещё не имеет сгенерированных первичных ключей и пока ещё не сохранен в базе данных,




2) managed — объект создан, управляется JPA, имеет сгенерированные первичные ключи,




3) detached — объект был создан, но не управляется (или больше не управляется) JPA,




4) removed — объект создан, управляется JPA, но будет удален после commit'a транзакции.

Как влияет операция persist на Entity объекты каждого из четырех статусов?

1) Если статус Entity new, то он меняется на managed и объект будет сохранен в базу при commit'е транзакции или в результате flush операций,




2) Если статус уже managed, операция игнорируется, однако зависимые Entity могут поменять статус на managed, если у них есть аннотации каскадных изменений,




3) Если статус removed, то он меняется на managed,




4) Если статус detached, будет выкинут exception сразу или на этапе commit'а транзакции,

Как влияет операция remove на Entity объекты каждого из четырех статусов?

1) Если статус Entity new, операция игнорируется, однако зависимые Entity могут поменять статус на removed, если у них есть аннотации каскадных изменений и они имели статус managed,




2) Если статус managed, то статус меняется на removed и запись объект в базе данных будет удалена при commit'е транзакции (так же произойдут операции remove для всех каскадно зависимых объектов),




3) Если статус removed, то операция игнорируется,




4) Если статус detached, будет выкинут exception сразу или на этапе commit'а транзакции,

Как влияет операция merge на Entity объекты каждого из четырех статусов?

1) Если статус Entity new, то будет создана новый managed entity, в который будут скопированы данные прошлого объекта,






2) Если статус managed, операция игнорируется, однако операция merge сработает на каскадно зависимые Entity, если их статус не managed,




3) Если статус detached, то либо данные будет скопированы в существующей managed entity с тем же первичным ключом, либо создан новый managed в который скопируются данные,




4) Если статус removed, будет выкинут exception сразу или на этапе commit'а транзакции,

Как влияет операция refresh на Entity объекты каждого из четырех статусов?

1) Если статус Entity managed, то в результате операции будут востановлены все изменения из базы данных данного Entity, так же произойдет refresh всех каскадно зависимых объектов,




2) Если статус new, removed или detached, будет выкинут exception,

Как влияет операция detach на Entity объекты каждого из четырех статусов?

1) Если статус Entity managed или removed, то в результате операции статус Entity (и всех каскадно-зависимых объектов) станет detached.




2) Если статус new или detached, то операция игнорируется,

Для чего нужна аннотация Basic?

The Basic annotation is the simplest type of mapping to a database column. The Basic annotationcan be applied to a persistent property or instance variable of any of the following types: Java primitivetypes, wrappers of the primitive types, java.lang.String, java.math.BigInteger,java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date,java.sql.Time, java.sql.Timestamp, byte[], Byte[], char[], Character[],enums, and any other type that implements Serializable. A

Для чего нужна аннотация Access?

Она определяет тип доступа (access type) для класса entity, суперкласса, embeddable или отдельных атрибутов, то есть как JPA будет обращаться к атрибутам entity, как к полям класса (FIELD) или как к свойствам класса (PROPERTY) имеющим getter/setter.




By default the access type is defined by the place where you put your identifier annotation (@Id). If you put it on the field - it will be AccessType.FIELD, if you put it on the getter - it will be AccessType.PROPERTY.

Какой аннотациями можно перекрыть связи (override entity relationship) или атрибуты, унаследованные от суперкласса, или заданные в embeddable классе при использовании этого embeddable класса в одном из entity классов и не перекрывать в остальных?

Для такого перекрывания существует четыре аннотации:


1. AttributeOverride чтобы перекрыть поля, свойства и первичные ключи,


2. AttributeOverrides аналогично можно перекрыть поля, свойства и первичные ключи со множественными значениями,


3. AssociationOverride чтобы перекрывать связи (override entity relationship),


4. AssociationOverrides чтобы перекрывать множественные связи (multiple relationship),

Какой аннотацией можно управлять кешированием JPA для данного Entity?

Cacheable — позволяет включить или выключить использование кеша второго уровня (second-level cache) для данного Entity (если провайдер JPA поддерживает работу с кешированием и настройки кеша (second-level cache) стоят как ENABLE_SELECTIVE или DISABLE_SELECTIVE, см вопрос 41). Обратите внимание свойство наследуется и если не будет перекрыто у наследников, то кеширование измениться и для них тоже.

Какие аннотации служит для задания класса преобразования basic атрибута Entity в другой тип при сохранении/получении данных их базы (например, работать с атрибутом Entity boolean типа, но в базу сохранять его как число)?

Convert и Converts — позволяют указать класс для конвертации Basic атрибута Entity в другой тип (Converts — позволяют указать несколько классов конвертации). Классы для конвертации должны реализовать интерфейс AttributeConverter и могут быть отмечены (но это не обязательно) аннотацией Converter.

What is EntityListeners?

Аннотация EntityListeners позволяет задать класс Listener, который будет содержать методы обработки событий (сallback methods) определенных Entity или Mapped Superclass.

Для чего нужны callback методы в JPA? К каким сущностям применяются аннотации callback методов? Перечислите семь callback методов (или что тоже самое аннотаций callback методов)

Callback методы служат для вызова при определенных событиях Entity (то есть добавить обработку например удаления Entity методами JPA), могут быть добавлены к entity классу, к mapped superclass, или к callback listener классу, заданному аннотацией EntityListeners (см предыдущий вопрос).




The annotation specifies when the callback method is invoked:


@PrePersist - before a new entity is persisted (added to the EntityManager).


@PostPersist - after storing a new entity in the database (during commit or flush).


@PostLoad - after an entity has been retrieved from the database.


@PreUpdate - when an entity is identified as modified by the EntityManager.


@PostUpdate - after updating an entity in the database (during commit or flush).


@PreRemove - when an entity is marked for removal in the EntityManager.


@PostRemove - after deleting an entity from the database (during commit or flush).

What for one can use @Transient annotation?


What's the difference with java keyword transient?

Java's transient keyword is used to denote that a field is not to be serialized, whereas JPA's @Transient annotation is used to indicate that a field is not to be persisted in the database, i.e. their semantics are different.

Что такое JPQL (Java Persistence query language) и чем он отличается от SQL?

JPQL (Java Persistence query language) - это язык запросов, практически такой же как SQL, однако вместо имен и колонок таблиц базы данных, он использует имена классов Entity и их атрибуты. В качестве параметров запросов так же используются типы данных атрибутов Entity, а не полей баз данных. В отличии от SQL в JPQL есть автоматический полиморфизм (см. следующий вопрос). Также в JPQL используется функции которых нет в SQL: такие как KEY (ключ Map'ы), VALUE (значение Map'ы), TREAT (для приведение суперкласса к его объекту-наследнику, downcasting), ENTRY и т.п.

Что означает полиморфизм (polymorphism) в запросах JPQL (Java Persistence query language) и как его «выключить»?

В отличии от SQL в запросах JPQL есть автоматический полиморфизм, то есть каждый запрос к Entity возвращает не только объекты этого Entity, но так же объекты всех его классов-потомков, независимо от стратегии наследования (например, запрос select * from Animal, вернет не только объекты Animal, но и объекты классов Cat и Dog, которые унаследованы от Animal). Чтобы исключить такое поведение используется функция TYPE в where условии (например select * from Animal a where TYPE(a) IN (Animal, Cat) уже не вернет объекты класса Dog).

Что такое Criteria API и для чего он используется?

Criteria API это тоже язык запросов, аналогичным JPQL (Java Persistence query language), однако запросы основаны на методах и объектах, то есть запросы выглядят так:




CriteriaBuilder cb = ...


CriteriaQuery q = cb.createQuery(Customer.class);


Root customer = q.from(Customer.class);


q.select(customer);


Describe JPA Entity Object Life Cycle?

When an entity object is initially created its state is New.  In this state the object is not yet associated with an EntityManager and has no representation in the database.


An entity object becomes Managed when it is persisted to the database v...

When an entity object is initially created its state is New. In this state the object is not yet associated with an EntityManager and has no representation in the database.




An entity object becomes Managed when it is persisted to the database via an EntityManager’s persist method, which must be invoked within an active transaction. On transaction commit, the owning EntityManager stores the new entity object to the database. Entity objects retrieved from the database by an EntityManager are also in the Managed state. If a managed entity object is modified within an active transaction the change is detected by the owning EntityManager and the update is propagated to the database on transaction commit.




A managed entity object can also be retrieved from the database and marked for deletion, by using the EntityManager’s remove method within an active transaction. The entity object changes its state from Managed to Removed, and is physically deleted from the database during commit.




The last state, Detached, represents entity objects that have been disconnected from the EntityManager. For instance, all the managed objects of an EntityManager become detached when the EntityManager is closed.

What is an EntityManager?

javax.persistence.EntityManager provides the operations from and to the database, e.g. find objects, persists them, remove objects from the database, etc. Entities which are managed by an EntityManager will automatically propagate these changes to the database (if this happens within a commit statement). These objects are known as persistent object. If the Entity Manager is closed (via close()) then the managed entities are in a detached state. These are known as the detached objects. If you want synchronize them again with the database, the a Entity Manager provides the merge() method. Once merged, the object(s) becomes perstent objects again.




The EntityManager is the API of the persistence context, and an EntityManager can be injected directly in to a DAO without requiring a JPA Template. The Spring Container is capable of acting as a JPA container and of injecting the EntityManager by honoring the @PersistenceContext (both as field-level and a method-level annotation).