Relationship with spt что такое
Учимся проектированию Entity Relationship — диаграмм
Здравствуйте. Данная статья посвящена одной из самых популярных, а также и многим знакомой, модели проектирования — ER(Entity Relationship), которая была предложена учёным, в области информатики — Питером Ченом, в 1976 году.
По ходу статьи простым языком на простых примерах из жизни — мы с Вами разработаем разные варианты диаграммы, которые будут зависеть от их типа связи. Начнём!
Объектно Ориентированное Проектирование
Быстрый старт
Главный плюс модели проектирования Entity Relationship — это то, что она универсальна. Вы можете проектировать БД(Базы данных), работу какой-либо программы, принципы взаимодействия и др.
Что нужно знать на старте изучения?
— Нужно знать на старте то, что основная работа проводится над взаимоотношением сущности и связи. Для более легкого восприятия, стоит запомнить, что сущность — существительное, которое находится в прямоугольнике, а связь — глагол, который находится в ромбе. Приведём пример:
Думаю, Вы поняли, что к чему. Наш Программист учит Python. Вроде, всё логично. Но вот, только, что это за единички в примере?
— Это показатель типа связи! В данном примере используется вид связи — Один к одному:
К видам связи мы ещё вернёмся, но чуть позже, а сейчас нужно разобрать ещё одно НО:
— Диаграмма должна читаться в обе стороны. Если прочесть слева на право, то всё логично, как было сказано ранее, но если наоборот… то мы ещё несколько раз задумаемся о том, что такое логика. Действительно, так записано и это правильно! Это лишь одна из некоторых особенностей данной модели, что иногда может запутать. Однако, ничто не мешает Вам, как и многим, со стороны единицы, добавить стрелочку, как на примере ниже:
P.S. Надеюсь, Вы заинтересованы. Такие диаграммы Вы можете создавать в редакторе диаграмм — Dia.
Атрибуты
Так, у нас есть программист, но мы ничего о нём не знаем… Без чего программист не программист?
— Без каких-то атрибутов!
Дополним наш пример:
Да, атрибуты не особо отличают нашего программиста от обычного человека… но в будущем мы это исправим новыми атрибутами! В моём представлении, атрибут — это COLUMN(столбец) в таблице Базы Данных.
Атрибуты бывают и пустыми
Если в таблице Вашей БД необязательно указывать фамилию(то атрибут будет необязательным), тогда атрибут должен состоять из двух овалов: внешнего и внутреннего(внутри которого название атрибута).
Вы можете встретить подчеркивание названия атрибута в диаграмме — это нормально. Пугаться этого не стоит, тк это просто индентифицирующий атрибут. То-есть, это атрибут, который должен быть заполнен всегда, который является обязательным(первичным ключом). Как пример — всем известный id.
Хорошо, а теперь нам нужно дать программисту знания(то, какие языки, технологии он знает).
— Но мы же не будем сразу перечислять каждым отдельным атрибутом составляющие его знаний?
Верно, мы воспользуемся составным атрибутом(атрибут, который состоит из атрибутов-составляющих)! Хочу отметить то, что атрибуты-составляющие — тоже могут быть составными. Вопрос лишь в том, как Вы будете это реализовывать.
Типы связи
Отлично. С этим мы смогли разобраться. Теперь рассмотрим оставшиеся типы связи!
Продолжим с типа связи — Один ко многому:
Теперь наш программист изучает ещё и Perl. Неплохо.
Однако, хочу отметить, что пример, указанный выше — лишь исключение, для того, чтобы показать наглядно, к чему идёт отношение, потому что ответвлений может быть тысяча, что глупо будет чертить. В будущем, мы вернёмся к сокращенной и правильной записи, а этот хиленький паттерн стоит просто запомнить, чтобы было общее представление, что к чему. Надеюсь, что у меня получилось объяснить Вам, что представляет тип связи «Один ко многому».
*Отношение одной сущности к нескольким и наоборот*
Перед продолжением изучения типов связи, Вы должны узнать, что атрибуты бывают и у связей.
Показывать на примере не буду — тк, это понять можно без проблем, на словах. Просто представьте, что у Вас есть связь «Транзакции». Допустим, что в Вашем проекте нужно сохранять всю информацию о сохранённых транзакциях, будь то сохранение в файле или бд — не важно. Вам нужно сохранять время, исключения(возникшие ошибки) и что-то ещё. В нашем случае, всё из перечисленного — атрибуты, которые будут принадлежать связи. Такие атрибуты тоже могут быть составными, идентифицирующими, необязательными. Вопрос только в реализации. Продолжим.
Остался последний тип связи — Многое ко многому:
Как обычно, покажу Вам на примере, но уже не с Программистом, а на примере взаимосвязи Зрителя с Фильмом, на каком-либо сервисе по просмотру Фильмов:
Тут два спорных момента. Начнём разбираться.
Первое:
— Почему связь больше смахивает на сущность?
Для упрощения связи типа «Многое ко многому» используются промежуточные сущности.
— Зритель может подписаться на много Фильмов.
— У Фильмов может быть много зрителей, которые подписаны на них.
А теперь рассмотрим другой способ реализации связи «Многое ко многому», который будет чуть сложнее в записи, но возможно понятнее тем, кто не знает о промежуточных сущностях:
Как Вы могли заметить, в данном примере есть тип связи «Один ко многому», и даже несколько.
Это правда и такое легко объяснить. Дело в том, тип связи «Многое ко многому» равняется двум «Один ко многому».
Наверное, Вы заинтересованы в том, почему у нас, между связью и сущностью, два ребра.
Это уже чуть сложнее объяснить. Читайте внимательно.
Дело в том, что бывают опциональные и обязательные связи. Запомните тождество:
Опциональные связи создают частичное участие, в то время как обязательные — полное.
— Что такое частичное и полное участия?
Частичное участие — тоже одно из исключений, похожее чем-то на необязательный атрибут, вот только зависит от сущности. Представьте картину. Есть две сущности:
Покупатель и Продукты. Тип связи — Один ко многому.
У них общая связь — Покупает. Но нам нужно понять другое. Без чего покупатель — не покупатель?
— Без хотя бы одной покупки!
Данный случай — представитель частичной связи, тк мы даём выбор «Покупать и стать покупателем или отказаться». В таком случае, у нас, будет одно ребро между связью «Покупает» и сущностью «Продукты». Теперь рассмотрим полное участие.
Полное участие представляет из себя тот случай, когда выбора нет. Наш программист останется программистом, даже если ничего не выучит, благодаря тому, что мы фиксируем на диаграмме то, что он должен что-то учить, а исключений быть не может. Фиксируем мы это дело двумя рёбрами. Тип участия зависит от того, как вы проектируете, нужна ли выборка на этапе связи.
С этим закончили. Продолжаем.
Вспомните пример «Один ко многому», где после связи «Учит» были названия ЯП(Языков программирования), что приводило к большому количеству разветвлений, потому как было не правильно в плане записи. Только подумайте, ведь нам не обязательно делать ответвления к каждому ЯП. Мы можем просто создать сущность «Язык программирования», в которой мы разместим атрибуты, которые будут отвечать за его название, возраст, мощность и многое другое. Думаю, Вы поняли. Советую использовать сокращенную запись «Многое ко многому».
Слабые сущности
Рассмотрим заключительное понятие.
Представьте, что у Вас в существует таблица «Родитель» и «Ребенок», соответственно такие-же сущности в диаграмме. Может ли одно существовать без другого? Я думаю — нет. Как в биологическом, так и в целом логическом.
Слабая сущность: яблока без яблони быть не может
В этом примере сущность «Ребенок» — слабая сущность.
Слабые сущности — это те сущности, которые не могут существовать без другой сущности.
Мы создаём сущность «Ребёнок», в надежде на то, что у Родителя/Родителей нет детей с одинаковыми именами, тк иначе — нашу сущность, которая может являться таблицей в БД, будет сложно назвать Нормализованной(таблица, в которой соблюдаются правила Автомарности данных и существует Первичный ключ-идентификатор), ведь мы банально не сможем отличить детей.
Однако, такие случаи имеют место быть, но исправить это можно добавлением дополнительного атрибута. В таком случае, атрибут «Имя» — то, что и создает подобную ситуацию, а называется он компонентом ключа слабой сущности. Название подобных атрибутов, в овалах, подчеркиваются пунктиром, а сущность и связь помещаются в дополнительные фигуры, в которых они состоят.
Представлю вам это на примере:
Заключение
В заключение хочется сказать, что одна из основополагающих грамотной кооперативной работы — хорошее объяснение поставленных задач, хорошее представление продукта, который нужно разработать, в чём и помогают модели проектирования. Entity Relatioship — модель проектирования, которая пользуется популярностью не один десяток лет. Она позволяет строить изящные диаграммы, которые, при правильном подходе, можно в будущем дополнять и видоизменять. Не поленитесь изучить. Спасибо за внимание!
Relationship with spt что такое
Продукты, решения и услуги для организаций
OSPF Fundamentals
OSPF route calculation involves the following processes:
The adjacency establishment process is as follows:
OSPF uses the shortest path first (SPF) algorithm to calculate routes to implement fast route convergence.
OSPF Neighbor States
To exchange routing information on an OSPF network, neighbor NE s must establish adjacencies. The differences between neighbor relationships and adjacencies are described as follows:
OSPF has eight neighbor states: Down, Attempt, Init, 2-way, Exstart, Exchange, Loading, and Full. Down, 2-way, and Full are stable states. Attempt, Init, Exstart, Exchange, and Loading are unstable states, which last only several minutes. Figure 6-3 shows the eight neighbor states.
OSPF Neighbor State
This is the initial state of a neighbor conversation. This state indicates that a NE has not received any Hello packets from its neighbors within a dead interval.
In the Attempt state, a NE periodically sends Hello packets to manually configured neighbors.
This state indicates that a NE has received Hello packets from its neighbors and neighbor relationships have been established between the NE s.
If no adjacency needs to be established, the neighbors remain in the 2-way state. If adjacencies need to be established, the neighbors enter the Exstart state.
In the Exstart state, NE s establish a master/slave relationship to ensure that DD packets are sequentially exchanged.
In the Exchange state, NE s exchange DD packets. A NE uses a DD packet to describe its own LSDB and sends the packet to its neighbors.
In the Loading state, a NE sends Link State Request (LSR) packets to its neighbors to request their LSAs for LSDB synchronization.
In the Full state, a NE establishes adjacencies with its neighbors and all LSDBs have been synchronized.
Adjacency Establishment
Adjacencies can be established in either of the following situations:
Two NE s have established a neighbor relationship and communicate for the first time.
The designated router (DR) or backup designated router (BDR) on a network segment changes.
The adjacency establishment process is different on different networks.
Adjacency establishment on a broadcast network
On a broadcast network, the DR and BDR establish adjacencies with each NE on the same network segment, but DR others establish only neighbor relationships.
Figure 6-4 shows the adjacency establishment process on a broadcast network.
The adjacency establishment process on a broadcast network is as follows:
Neighbor relationship establishment
Router A uses the multicast address 224.0.0.5 to send a Hello packet to Router B through the OSPF interface connected to a broadcast network. The packet carries the DR field of 1.1.1.1 (ID of Router A) and the Neighbors Seen field of 0. A neighbor NE has not been discovered, and Router A regards itself as a DR.
After Router B receives the packet, it returns a Hello packet to Router A. The returned packet carries the DR field of 2.2.2.2 (ID of Router B) and the Neighbors Seen field of 1.1.1.1 (Router A’s router ID). Router A has been discovered but its router ID is less than that of Router B, and therefore Router B regards itself as a DR. Then Router B’s state changes to Init.
After Router A receives the packet, Router A’s state changes to 2-way.
Master/Slave negotiation and DD packet exchange
To improve transmission efficiency, Router A and Router B determine which LSAs in each other’s LSDB need to be updated. If one party determines that an LSA of the other party is already in its own LSDB, it does not send an LSR packet for updating the LSA to the other party. To achieve the preceding purpose, Router A and Router B first send DD packets, which carry summaries of LSAs in their own LSDBs. Each summary identifies an LSA. To ensure packet transmission reliability, a master/slave relationship must be determined during DD packet exchange. One party serving as a master uses the Seq field to define a sequence number. The master increases the sequence number by one each time it sends a DD packet. When the other party serving as a slave sends a DD packet, it adds the sequence number carried in the last DD packet received from the master to the Seq field of the packet.
After Router B receives the DD packet, Router B’s state changes to Exstart and Router B returns a DD packet to Router A. The returned packet does not carry LSA summaries. Because Router B’s router ID is greater than Router A’s router ID, Router B declares itself a master and sets the Seq field to y.
After Router A receives the DD packet, it agrees that Router B is a master and Router A’s state changes to Exchange. Then Router A sends a DD packet to Router B to transmit LSA summaries. The packet carries the Seq field of y and the MS field of 0. The value 0 indicates that Router A declares itself a slave.
After Router B receives the packet, Router B’s state changes to Exchange and Router B sends a new DD packet containing its own LSA summaries to Router A. The value of the Seq field carried in the new DD packet is changed to y + 1.
Router A uses the same sequence number as Router B to confirm that it has received DD packets from Router B. Router B uses the sequence number plus one to confirm that it has received DD packets from Router A. When Router B sends the last DD packet, it sets the M field of the packet to 0.
After Router A receives the last DD packet, it finds that many LSAs in Router B’s LSDB do not exist in its own LSDB, so Router A’s state changes to Loading. After Router B receives the last DD packet from Router A, Router B’s state directly changes to Full, because Router B’s LSDB already contains all LSAs of Router A.
Router A sends an LSR packet for updating LSAs to Router B. Router B returns an LSU packet to Router A. After Router A receives the packet, it sends an LSAck packet for acknowledgement.
The preceding procedures continue until the LSAs in Router A’s LSDB are the same as those in Router B’s LSDB. Router A’s state changes to Full. After Router A and Router B exchange DD packets and update all LSAs, they establish an adjacency.
Adjacency establishment on an NBMA network
The adjacency establishment process on an NBMA network is similar to that on a broadcast network. The blue part shown in Figure 6-5 highlights the differences from a broadcast network.
On an NBMA network, all NE s establish adjacencies only with the DR and BDR.
The adjacency establishment process on an NBMA network is as follows:
Neighbor relationship establishment
After Router B sends a Hello packet to a Down interface of Router A, Router B’s state changes to Attempt. The packet carries the DR field of 2.2.2.2 (ID of Router B) and the Neighbors Seen field of 0. A neighbor NE has not been discovered, and Router B regards itself as a DR.
After Router A receives the packet, Router A’s state changes to Init and Router A returns a Hello packet. The returned packet carries the DR and Neighbors Seen fields of 2.2.2.2. Router B has been discovered but its router ID is greater than that of Router A, and therefore Router A agrees that Router B is a DR.
Master/Slave relationship negotiation and DD packet exchange
The procedures for negotiating a master/slave relationship and exchanging DD packets on an NBMA network are the same as those on a broadcast network.
The procedure for synchronizing LSDBs on an NBMA network is the same as that on a broadcast network.
Adjacency establishment on a point-to-point (P2P)/Point-to-multipoint (P2MP) network
Route Calculation
OSPF uses an LSA to describe the network topology. A Type 1 LSA describes the attributes of a link between NE s. A NE transforms its LSDB into a weighted, directed graph, which reflects the topology of the entire AS. All NE s in the same area have the same graph. Figure 6-6 shows a weighted, directed graph.
Based on the graph, each NE uses the SPF algorithm to calculate an SPT with itself as the root. The SPT shows routes to nodes in the AS. Figure 6-7 shows an SPT.
When a NE ‘s LSDB changes, the NE recalculates a shortest path. Frequent SPF calculations consume a large amount of resources and affect NE efficiency. Changing the interval between SPF calculations can prevent resource consumption caused by frequent LSDB changes. The default interval between SPF calculations is 5 seconds.
The route calculation process is as follows:
A NE calculates intra-area routes.
The NE uses an SPF algorithm to calculate shortest paths to other NE s in an area. Type 1 and Type 2 LSAs accurately describe the network topology in an area. Based on the network topology described by a Type 1 LSA, the NE calculates paths to other NE s in the area.
The NE calculates inter-area routes.
For the NE s in an area, the network segment of the routes in an adjacent area is directly connected to the area border router (ABR). Because the shortest path to the ABR has been calculated in the preceding step, the NE s can directly check a Type 3 LSA to obtain the shortest path to the network segment. The autonomous system boundary router (ASBR) can also be considered connected to the ABR. Therefore, the shortest path to the ASBR can also be calculated in this phase.
The NE calculates AS external routes.
AS external routes can be considered to be directly connected to the ASBR. Because the shortest path to the ASBR has been calculated in the preceding phase, the NE can check Type 5 LSAs to obtain the shortest paths to other ASs.
Шпаргалка Java программиста 1: JPA и Hibernate в вопросах и ответах
Знаете ли вы JPA? А Hibernate? А если проверить?
За время работы Java программистом я заметил, что как правило программисты постоянно и планомерно используют от силы 10-20% от возможностей той или иной технологии, при этом остальные возможности быстро забываются и при появлении новых требований, переходе на новую работу или подготовке к техническому интервью приходится перечитывать все документации и спецификации с нуля. Зато наличие краткого конспекта особенностей тех или иных технологий (шпаргалок) позволяет быстро освежить в памяти особенности той или иной технологии.
Данная статья будет полезна и для тех кто только собирается изучать JPA и Hibernate (В этом случае рекомендую сразу открывать ответы), и для тех кто уже хорошо знает JPA и Hibernate (В этом случае статья позволит проверить свои знания и освежить особенности технологий). Особенно статья будет полезна тем кто собирается пройти техническое интервью, где возможно будут задавать вопросы по JPA и Hibernate (или сам собирается провести техническое интервью).
Рекомендую так считать правильные ответы: если вы ответили на вопрос по вашему мнению правильно и полностью — поставьте себе 1 балл, если ответили только частично — 0.5 балл. Везде где только возможно я старался добавлять цитаты из оригинальной документации (но из-за ограничений лицензии Oracle не могу давать слишком большие цитаты из документации).
Общие вопросы
JPA (Java Persistence API) это спецификация Java EE и Java SE, описывающая систему управления сохранением java объектов в таблицы реляционных баз данных в удобном виде. Сама Java не содержит реализации JPA, однако есть существует много реализаций данной спецификации от разных компаний (открытых и нет). Это не единственный способ сохранения java объектов в базы данных (ORM систем), но один из самых популярных в Java мире.
Entity это легковесный хранимый объект бизнес логики (persistent domain object). Основная программная сущность это entity класс, который так же может использовать дополнительные классы, который могут использоваться как вспомогательные классы или для сохранения состояния еntity.
И это тоже допустимо
Может, при этом он сохраняет все свойства 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 класса в базе данных,
JPA указывает что она может работать как с свойствами классов (property), оформленные в стиле JavaBeans, либо с полями (field), то есть переменными класса (instance variables). Соответственно, при этом тип доступа будет либо property access или field access.
JPA указывает что она может работать как с свойствами классов (property), оформленные в стиле JavaBeans, либо с полями (field), то есть переменными класса (instance variables). Оба типа элементов Entity класса называются атрибутами Entity класса.
Допустимые типы атрибутов у Entity классов:
1. примитивные типы и их обертки Java,
2. строки,
3. любые сериализуемые типы Java (реализующие Serializable интерфейс),
4. enums;
5. entity types;
6. embeddable классы
7. и коллекции типов 1-6
Допустимые типы атрибутов, входящих в первичный ключ:
1. примитивные типы и их обертки Java,
2. строки,
3. BigDecimal и BigInteger,
4. java.util.Date и java.sql.Date,
В случае автогенерируемого первичного ключа (generated primary keys) допустимы
1. только числовые типы,
В случае использования других типов данных в первичном ключе, он может работать только для некоторых баз данных, т.е. становится не переносимым (not portable),
Сложные структуры JPA
Встраиваемый (Embeddable) класс это класс который не используется сам по себе, только как часть одного или нескольких Entity классов. Entity класс могут содержать как одиночные встраиваемые классы, так и коллекции таких классов. Также такие классы могут быть использованы как ключи или значения map. Во время выполнения каждый встраиваемый класс принадлежит только одному объекту Entity класса и не может быть использован для передачи данных между объектами Entity классов (то есть такой класс не является общей структурой данных для разных объектов). В целом, такой класс служит для того чтобы выносить определение общих атрибутов для нескольких Entity, можно считать что JPA просто встраивает в Entity вместо объекта такого класса те атрибуты, которые он содержит.
Может, но только в случае если такой класс не используется как первичный ключ или ключ map’ы.
1. Такие классы должны удовлетворять тем же правилам что Entity классы, за исключением того что они не обязаны содержать первичный ключ и быть отмечены аннотацией Entity (см. вопрос 10),
2. Embeddable класс должен быть отмечен аннотацией Embeddable или описан в XML файле конфигурации JPA,
Существуют следующие четыре типа связей
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 это класс от которого наследуются Entity, он может содержать анотации JPA, однако сам такой класс не является Entity, ему не обязательно выполнять все требования установленные для Entity (например, он может не содержать первичного ключа). Такой класс не может использоваться в операциях EntityManager или Query. Такой класс должен быть отмечен аннотацией MappedSuperclass или соответственно описан в xml файле.
Example: Concrete class as a mapped superclass
В JPA описаны три стратегии наследования мапинга (Inheritance Mapping Strategies), то есть как JPA будет работать с классами-наследниками Entity:
1) одна таблица на всю иерархию наследования (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 соотвественно.
2) объединяющая стратегия (joined subclass strategy) — в этой стратегии каждый класс enity сохраняет данные в свою таблицу, но только уникальные колонки (не унаследованные от классов-предков) и первичный ключ, а все унаследованные колонки записываются в таблицы класса-предка, дополнительно устанавливается связь (relationships) между этими таблицами, например в случае классов Animals (см.выше), будут три таблицы animals, cats, dogs, причем в cats будет записана только ключ и скорость лазанья, в dogs — ключ и умеет ли пес приносить палку, а в animals все остальные данные cats и dogs c ссылкой на соответствующие таблицы. Минусом тут являются потери производительности от объединения таблиц (join) для любых операций.
3) одна таблица для каждого класса (table per concrete class strategy) — тут все просто каждый отдельный класс-наследник имеет свою таблицу, т.е. для cats и dogs (см.выше) все данные будут записываться просто в таблицы cats и dogs как если бы они вообще не имели общего суперкласса. Минусом является плохая поддержка полиморфизма (polymorphic relationships) и то что для выборки всех классов иерархии потребуются большое количество отдельных sql запросов или использование UNION запроса.
Для задания стратегии наследования используется аннотация Inheritance (или соответствующие блоки
Java Persistence 2.1. Chapter 2.12, J7EE javadoc
В JPA описаны два типа fetch стратегии:
1) LAZY — данные поля будут загруженны только во время первого доступа к этому полю,
2) EAGER — данные поля будут загруженны немедленно,
Основные операции с Entity
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
4) Общие операции над EntityManager или всеми Entities: close, isOpen, getProperties, setProperty, clear
Interface used to interact with the persistence context.
An EntityManager instance is associated with a persistence context. A persistence context is a set of entity instances in which for any persistent entity identity there is a unique entity instance. Within the persistence context, the entity instances and their lifecycle are managed. The EntityManager API is used to create and remove persistent entity instances, to find entities by their primary key, and to query over entities.
The set of entities that can be managed by a given EntityManager instance is defined by a persistence unit. A persistence unit defines the set of all classes that are related or grouped by the application, and which must be colocated in their mapping to a single database.
У Entity объекта существует четыре статуса жизненного цикла: new, managed, detached, или removed. Их описание
1) new — объект создан, но при этом ещё не имеет сгенерированных первичных ключей и пока ещё не сохранен в базе данных,
2) managed — объект создан, управляется JPA, имеет сгенерированные первичные ключи,
3) detached — объект был создан, но не управляется (или больше не управляется) JPA,
4) removed — объект создан, управляется JPA, но будет удален после commit’a транзакции.
An entity instance can be characterized as being new, managed, detached, or removed.
• A new entity instance has no persistent identity, and is not yet associated with a persistence context.
• A managed entity instance is an instance with a persistent identity that is currently associated with a persistence context.
• A detached entity instance is an instance with a persistent identity that is not (or no longer) associated with a persistence context.
• A removed entity instance is an instance with a persistent identity, associated with a persistence context, that will be removed from the database upon transaction commit.
1) Если статус Entity new, то он меняется на managed и объект будет сохранен в базу при commit’е транзакции или в результате flush операций,
2) Если статус уже managed, операция игнорируется, однако зависимые Entity могут поменять статус на managed, если у них есть аннотации каскадных изменений,
3) Если статус removed, то он меняется на managed,
4) Если статус detached, будет выкинут exception сразу или на этапе commit’а транзакции,
1) Если статус Entity new, операция игнорируется, однако зависимые Entity могут поменять статус на removed, если у них есть аннотации каскадных изменений и они имели статус managed,
2) Если статус managed, то статус меняется на removed и запись объект в базе данных будет удалена при commit’е транзакции (так же произойдут операции remove для всех каскадно зависимых объектов),
3) Если статус removed, то операция игнорируется,
4) Если статус detached, будет выкинут exception сразу или на этапе commit’а транзакции,
1) Если статус detached, то либо данные будет скопированы в существующей managed entity с тем же первичным ключом, либо создан новый managed в который скопируются данные,
1) Если статус Entity new, то будет создана новый managed entity, в который будут скопированы данные прошлого объекта,
2) Если статус managed, операция игнорируется, однако операция merge сработает на каскадно зависимые Entity, если их статус не managed,
3) Если статус removed, будет выкинут exception сразу или на этапе commit’а транзакции,
1) Если статус Entity managed, то в результате операции будут востановлены все изменения из базы данных данного Entity, так же произойдет refresh всех каскадно зависимых объектов,
2) Если статус new, removed или detached, будет выкинут exception,
1) Если статус Entity managed или removed, то в результате операции статус Entity (и всех каскадно-зависимых объектов) станет detached.
2) Если статус new или detached, то операция игнорируется,
Аннотации JPA
Она определяет тип доступа (access type) для класса entity, суперкласса, embeddable или отдельных атрибутов, то есть как JPA будет обращаться к атрибутам entity, как к полям класса (FIELD) или как к свойствам класса (PROPERTY), имеющие гетеры (getter) и сетеры (setter).
Для такого перекрывания существует четыре аннотации:
1. AttributeOverride чтобы перекрыть поля, свойства и первичные ключи,
2. AttributeOverrides аналогично можно перекрыть поля, свойства и первичные ключи со множественными значениями,
3. AssociationOverride чтобы перекрывать связи (override entity relationship),
4. AssociationOverrides чтобы перекрывать множественные связи (multiple relationship),
Example 2: Overriding of the mapping for the phoneNumbers relationship defined in the ContactInfo
embeddable class.
The Cacheable annotation specifies whether an entity should be cached if caching is enabled when
the value of the persistence.xml shared-cache-mode element is ENABLE_SELECTIVE or
DISABLE_SELECTIVE. The value of the Cacheable annotation is inherited by subclasses; it can be
overridden by specifying Cacheable on a subclass.
Cacheable(false) means that the entity and its state must not be cached by the provider.
If the shared-cache-mode element is not specified in the persistence.xml file and the
javax.persistence.sharedCache.mode property is not specified when the entity manager
factory for the persistence unit is created, the semantics of the Cacheable annotation are undefined.
Convert и Converts — позволяют указать класс для конвертации Basic аттрибута Entity в другой тип (Converts — позволяют указать несколько классов конвертации). Классы для конвертации должны реализовать интерфейс AttributeConverter и могут быть отмечены (но это не обязательно) аннотацией Converter.
Аннотация EntityListeners позволяет задать класс Listener, который будет содержать методы обработки событий (сallback methods) определенных Entity или Mapped Superclass.
Callback методы служат для вызова при определенных событиях Entity (то есть добавить обработку например удаления Entity методами JPA), могут быть добавлены к entity классу, к mapped superclass, или к callback listener классу, заданному аннотацией EntityListeners (см предыдущий вопрос). Существует семь callback методов (и аннотаций с теми же именами):
1) PrePersist
2) PostPersist
3) PreRemove
4) PostRemove
5) PreUpdate
6) PostUpdate
7) PostLoad
Подробнее, см Javadoc 7ee или спецификация JPA2.1 глава 3.5.2
Для этого служит аннотация OrderBy и OrderColumn
Подробнее, см Javadoc 7ee или спецификация JPA2.1 глава 11.1.42
Для этого служит аннотация Transient
Подробнее, см Javadoc 7ee или спецификация JPA2.1 глава 11.1.52
Сложные вопросы JPA
У JPA есть шесть видов блокировок, перечислим их в порядке увеличения надежности (от самого ненадежного и быстрого, до самого надежного и медленного):
1) NONE — без блокировки
2) OPTIMISTIC (или синоним READ, оставшийся от JPA 1) — оптимистическая блокировка,
3) OPTIMISTIC_FORCE_INCREMENT (или синоним WRITE, оставшийся от JPA 1) — оптимистическая блокировка с принудительным увеличением поля версионности,
4) PESSIMISTIC_READ — пессимистичная блокировка на чтение,
5) PESSIMISTIC_WRITE — пессимистичная блокировка на запись (и чтение),
6) PESSIMISTIC_FORCE_INCREMENT — пессимистичная блокировка на запись (и чтение) с принудительным увеличением поля версионности,
Подробнее, см Javadoc 7ee и описание оптимистичных и пессимистичных блокировок баз данных.
JPA говорит о двух видов кэшей (cache):
1) first-level cache (кэш первого уровня) — кэширует данные одной транзакции,
2) second-level cache (кэш второго уровня) — кэширует данные дольше чем одна транзакция. Провайдер JPA может, но не обязан реализовывать работу с кэшем второго уровня. Такой вид кэша позволяет сэкономить время доступа и улучшить производительность, однако оборотной стороной является возможность получить устаревшие данные.
Подробнее, см JPA 2.1 specification, 3.9 Caching
JPA говорит о пяти значениях shared-cache-mode из persistence.xml, который определяет как будет использоваться second-level cache:
1) ALL — все Entity могут кэшироваться в кеше второго уровня,
2) NONE — кеширование отключено для всех Entity,
3) ENABLE_SELECTIVE — кэширование работает только для тех Entity, у которых установлена аннотация Cacheable(true) или её xml эквивалент, для всех остальных кэширование отключено,
4) DISABLE_SELECTIVE — кэширование работает для всех Entity, за исключением тех у которых установлена аннотация Cacheable(false) или её xml эквивалент
5) UNSPECIFIED — кеширование не определенно, каждый провайдер JPA использует свою значение по умолчанию для кэширования,
Подробнее, см JPA 2.1 specification, 3.9 Caching
Для этого существует EntityGraph API, используется он так: с помощью аннотации NamedEntityGraph для Entity, создаются именованные EntityGraph объекты, которые содержат список атрибутов у которых нужно поменять fetchType на EAGER, а потом данное имя указывается в hits запросов или метода find. В результате fetchType атрибутов Entity меняется, но только для этого запроса. Существует две стандартных property для указания EntityGraph в hit:
1) javax.persistence.fetchgraph — все атрибуты перечисленные в EntityGraph меняют fetchType на EAGER, все остальные на LAZY
2) javax.persistence.loadgraph — все атрибуты перечисленные в EntityGraph меняют fetchType на EAGER, все остальные сохраняют свой fetchType (то есть если у атрибута, не указанного в EntityGraph, fetchType был EAGER, то он и останется EAGER)
С помощью NamedSubgraph можно также изменить fetchType вложенных объектов Entity.
Подробнее, см JPA 2.1 specification, 3.7 EntityGraph
Для работы с кэшем второго уровня (second level cache) в JPA описан Cache интерфейс, содержащий большое количество методов по управлению кэшем второго уровня (second level cache), если он поддерживается провайдером JPA, конечно. Объект данного интерфейса можно получить с помощью метода getCache у EntityManagerFactory.
Подробнее, см JPA 2.1 specification, 7.10 Cache Interface
Для получения такой информации в JPA используется интерфейс Metamodel. Объект этого интерфейса можно получить методом getMetamodel у EntityManagerFactory или EntityManager.
Подробнее, см JPA 2.1 specification, 5 Metamodel API
JPQL (Java Persistence query language) это язык запросов, практически такой же как SQL, однако вместо имен и колонок таблиц базы данных, он использует имена классов Entity и их атрибуты. В качестве параметров запросов так же используются типы данных атрибутов Entity, а не полей баз данных. В отличии от SQL в JPQL есть автоматический полиморфизм (см. следующий вопрос). Также в JPQL используется функции которых нет в SQL: такие как KEY (ключ Map’ы), VALUE (значение Map’ы), TREAT (для приведение суперкласса к его объекту-наследнику, downcasting), ENTRY и т.п.
Подробнее, см JPA 2.1 specification, Chapter 4 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).
Подробнее, см JPA 2.1 specification, Chapter 4 Query Language
Criteria API это тоже язык запросов, аналогичным JPQL (Java Persistence query language), однако запросы основаны на методах и объектах, то есть запросы выглядят так:
Подробнее, см JPA 2.1 specification, Chapter 6 Criteria API
Отличия Hibernate 5.0 от JPA 2.1 или JPA 2.0 от JPA 2.1
1) Конструктор без аргументов не обязан быть public или protected, рекомендуется чтобы он был хотя бы package видимости, однако это только рекомендация, если настройки безопасности Java позволяют доступ к приватным полям, то он может быть приватным,
2) JPA категорически требует не использовать final классы, Hibernate лишь рекомендует не использовать такие классы чтобы он мог создавать прокси для ленивой загрузки, однако позволяет либо выключить прокси Proxy(lazy=false), либо использовать в качестве прокси интерфейс, содержащий все методы маппинга для данного класса (аннотацией Proxy(proxyClass=интерфейс.class) )
В отличии JPA в Hibernate есть уникальная стратегия наследования, которая называется implicit polymorphism.
Hibernate supports the three basic inheritance mapping strategies:
table per class hierarchy
table per subclass
table per concrete class
In addition, Hibernate supports a fourth, slightly different kind of polymorphism:
В спецификации JPA 2.1 появились:
1) Entity Graphs — механизм динамического изменения fetchType для каждого запроса,
2) Converters — механизм определения конвертеров для задания функций конвертации атрибутов Entity в поля базы данных,
3) DDL генерация — автоматическая генерация таблиц, индексов и схем,
4) Stored Procedures — механизм вызова хранимых процедур из JPA,
5) Criteria Update/Delete — механизм вызова bulk updates или deletes, используя Criteria API,
6) Unsynchronized persistence contexts — появление возможности указать SynchronizationType,
7) Новые возможности в JPQL/Criteria API: арифметические подзапросы, generic database functions, join ON clause, функция TREAT,
8) Динамическое создание именованных запросов (named queries)
Подробнее о изменении интерфейсов и API в JPA 2.1:
1) Интерфейс EntityManager получил новые методы createStoredProcedureQuery, isJoinedToTransaction и createQuery(CriteriaUpdate или CriteriaDelete)
2) Абстрактный класс AbstractQuery стал наследоваться от класса CommonAbstractCriteria, появились новые интерфейсы CriteriaUpdate, CriteriaDelete унаследованные CommonAbstractCriteria,
3) PersistenceProvider получил новые функции generateSchema позволяющие генерить схемы,
4) EntityManagerFactory получил методы addNamedQuery, unwrap, addNamedEntityGraph, createEntityManager (с указанием SynchronizationType)
5) Появился новый enum SynchronizationType, Entity Graphs, StoredProcedureQuery и AttributeConverter интерфейсы,