Домой Учебники по Java и J2EE Что такое Hibernate? Основы реализации Hibernate Core

Что такое Hibernate? Основы реализации Hibernate Core

541
0

Hibernate является открытым исходным кодом Java рамки живучести проекта. Выполнять мощные объектно-реляционные сопоставления и базы данных запросов с использованием HQL и SQL.

В целом, широко используемые библиотеки хорошо спроектированы и реализованы, и очень интересно узнать из них некоторые лучшие практики кодирования .

Давайте заглянем внутрь библиотеки ядра hibernate и раскроем некоторые из ее ключей дизайна.

В этом посте Hibernate Core анализируется JArchitect углубиться в его дизайн и реализацию.

Пакет по функции

Package-by-feature использует пакеты для отражения набора функций. Он помещает все элементы, относящиеся к одной функции (и только этой функции), в один каталог / пакет. Это приводит к упаковкам с высокой когезией и высокой модульностью, а также с минимальной связью между упаковками. Предметы, которые работают в тесном контакте, расположены рядом друг с другом.

Ядро Hibernate содержит множество пакетов , каждый из которых связан с определенной функцией hql, sql и другими.

Связь

Низкая связь желательна, потому что изменение в одной области приложения потребует меньше изменений во всем приложении. В долгосрочной перспективе это может снизить затраты времени, усилий и средств, связанных с изменением и добавлением новых функций в приложение .

Вот три ключевых преимущества использования интерфейсов:

  • Интерфейс предоставляет способ определения контракта, который способствует повторному использованию. Если объект реализует интерфейс, то этот объект должен соответствовать стандарту. Объект, который использует другой объект, называется потребителем. Интерфейс — это контракт между объектом и его потребителем.
  • Интерфейс также обеспечивает уровень абстракции, который облегчает понимание программ. Интерфейсы позволяют разработчикам начать говорить об общем поведении кода, не вдаваясь в подробности.
  • Интерфейс обеспечивает низкую связь между компонентами, что облегчает защиту потребителя интерфейса от любых изменений реализации в классах, реализующих интерфейсы.

Давайте найдем все интерфейсы, определенные Hibernate Core, для которых мы используем CQLinq запросить базу кода.

1
от    T в Типы где т . IsInterface select T

Если нашей основной целью является обеспечение слабой связи, существует распространенная ошибка при использовании интерфейсов, которые могут убить полезность их использования. Это использование конкретных классов вместо интерфейсов, и чтобы лучше объяснить эту проблему, давайте возьмем следующий пример:

Класс A реализует интерфейс IA, который содержит метод Calculate () , а потребительский класс C реализован так

1
2
3
4
5
6
7
8
9
10
11
общественности учебный класс C <бр>
{
   ….
   общественности недействительным рассчитать ( )
   {
     …. ,
     m_a. рассчитать ( ) ;
     ….
     }
     м_а ;
}

Класс C вместо ссылки на интерфейс IA ссылается на класс A, в этом случае мы теряем преимущество низкой связи, и эта реализация имеет два основных недостатка:

  • Если мы решим использовать другую реализацию IA, мы должны изменить код класса C.
  • Если некоторые методы добавляются к A, не существующему в IA, и C использует их, мы также теряем преимущество контракта от использования интерфейсов.

C # ввел в язык явную возможность реализации интерфейса, чтобы гарантировать, что метод из IA никогда не будет вызываться из ссылки на конкретные классы , а только из ссылки на интерфейс. Этот метод очень полезен для защиты разработчиков от потери преимуществ использования интерфейсов.

С JArchitect мы можем проверить этот тип ошибок, используя CQLinq идея состоит в том, чтобы искать все методы из конкретных классов, используемых непосредственно другими методами.

1
2
3
4
5
6
7
8
9
от м в Методы где м. NbMethodsCallingMe > 0 && м. ParentType . IsClass
&& ! м. ParentType . IsThirdParty && ! м. ParentType . IsAbstract
пусть интерфейсы = м. ParentType . InterfacesImplemented
от я в интерфейсы где я. Методы. Где ( a = > a . Имя == м . Имя &&
а . ParentType ! = Т. ParentType ) . Count ( ) > 0
Выбрать новый { м, м. ParentType , я }

Например, метод getEntityPersister из SessionFactoryImpl, который реализует интерфейс SessionFactoryImplementor, касается этой проблемы.

Давайте искать методы, вызывающие непосредственно SessionFactoryImpl.getEntityPersister.

1
2
3
от м в Методы где м. Использует ( org.hibernate.internal.SessionFactoryImpl.getEntityPersister (String) )
Выбрать новый { м , м. NbBCInstructions }

Такие методы, как SessionImpl.instantiate, вызывают напрямую getEntityPersister вместо передачи по интерфейсу, что лишает преимущества использования интерфейсов. К счастью, ядро hibernate не содержит многих методов, имеющих эту проблему.

Сцепление с внешними банками

Когда используются внешние библиотеки, лучше проверить, можем ли мы легко заменить стороннюю библиотеку другой, не затрагивая все приложение, есть много причин, которые могут побудить нас изменить стороннюю библиотеку.

Другая библиотека может:

  • Иметь больше возможностей
  • Более могущественный
  • Более безопасный

Давайте возьмем пример antlr lib который раньше анализировал hql-запросы и представлял, что был создан другой парсер, более мощный, чем antlr, могли бы мы легко изменить antlr новым парсером?

Чтобы ответить на этот вопрос, давайте посмотрим, какие методы из hibernate используют его напрямую:

1
2
3
от м в Методы где м. Использует ( antlr-2.7.7 )
Выбрать новый { м , м. NbBCInstructions }

И какие использовали это косвенно:

1
2
3
4
от м в Проекты . WithNameNotIn ( antlr-2.7.7 ) . ChildMethods ( )
пусть глубина0 знак равно м. DepthOfIsUsing ( antlr-2.7.7 )
где depth0 > 1 Сортировать по depth0
Выбрать новый { м , depth0 }

Многие методы напрямую используют antlr, что делает ядро гибернации тесно связанным с ним, и замена antlr другим не является легкой задачей. этот факт не означает, что у нас есть проблема в спящем дизайне, но мы должны быть осторожны при использовании сторонних библиотек и тщательно проверять, должна ли сторонняя библиотека быть слабосвязанной или нет с приложением.

когезия

Принцип единой ответственности гласит, что у класса должна быть одна и только одна причина для изменения. Такой класс называется сплоченным. Высота LCOM значение обычно указывает на плохо сплоченный класс. Есть несколько метрик LCOM. LCOM принимает свои значения в диапазоне [0-1]. LCOMHS (HS означает «Хендерсон-Селлерс») принимает значения в диапазоне [0-2]. Обратите внимание, что метрика LCOMHS часто считается более эффективной для обнаружения несвязных типов.

Значение LCOMHS выше 1 следует считать тревожным.

В общих классах больше всего интересует сплоченность — это классы, имеющие много методов и полей.

Давайте искать типы, имеющие много методов и полей.

1
2
3
4
от T в Типы где
( т . Методы . Count ( ) > 40 | | т . Поля. Count ( ) > 40 ) && т . IsClass
Сортировать по т . Методы. Count ( ) нисходящий
Выбрать новый { т , т . Методы экземпляра , т . Поля , т . LCOMHS }

Только несколько типов касаются этого запроса, и для всех них LCOMHS меньше 1.

Использование аннотаций

Разработка на основе аннотаций освобождает Java-разработчиков от необходимости громоздкой конфигурации . И дайте нам мощную функцию, чтобы освободить исходный код от стандартного кода. Результирующий код также с меньшей вероятностью содержит ошибки.

Давайте найдем все аннотации, определенные ядром hibernate.

1
от T в Типы где т . IsAnnotationClass && ! т . IsThirdParty выберите T

Определено множество аннотаций, благодаря которым разработчики могут легко использовать hibernate, а головная боль файлов конфигурации исключается.

Заключение

Hibernate Core является хорошим примером проектов с открытым исходным кодом, чтобы изучить их, не стесняйтесь заглянуть внутрь.

Что такое Hibernate? Основы реализации Hibernate Core

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Как отсортировать HashMap по ключу и значению в Java 8 - полное руководство

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь