Главная страница

1. Что такое Maven Выполняемые задачи. Основные понятия артефакт, зависимость, архетип, цель goal


Скачать 38.64 Kb.
Название1. Что такое Maven Выполняемые задачи. Основные понятия артефакт, зависимость, архетип, цель goal
Анкорreviw 1 hibernate
Дата28.12.2022
Размер38.64 Kb.
Формат файлаdocx
Имя файла1st review.docx
ТипДокументы
#867661


1. Что такое Maven? Выполняемые задачи. Основные понятия: артефакт, зависимость, архетип, цель (goal), репозиторий. Как добавлять в проект библиотеки без него?
Maven это фреймворк для автоматизации сборки проектов, компиляции, создания jar, создания дистрибутива программы, генерации документации. Основан на описании структуры в файлах на языке POM, являющемся подмножеством XML.
Репозиторий (repository) - глобальное хранилище всех библиотек, доступных для Maven, это место где хранятся артефакты: jar файлы, pom-файлы, javadoc, исходники, плагины.

Репозиторий может быть:

-Локальный - директория на компьютере,создаётся в момент первого выполнения любой команды Maven. По умолчанию она расположена в /.m2/repository - персональная для каждого пользователя.

- Центральный - это репозиториий, который обеспечивается сообществом Maven. Он содержит огромное количество часто используемых библиотек. Который расположен в http://repo1.maven.org/maven2/ и доступен на чтение для всех пользователей в интернете. 
-
Удаленный - удалённый репозиторий, который является репозиторием, который определяется самим разработчиком
Артефакт (artefact) - это, по сути, любая библиотека, хранящаяся в репозитории. Это может быть какая-то зависимость или плагин. Обычно артефактом является JAR-файл, который хранится в репозитории Maven. Каждый артефакт содержит group ID, artifact ID и версию.
Архетип (archetype) - это некая стандартная компоновка файлов и каталогов в проектах различного рода (веб, swing-проекты и прочие). Другими словами, Maven знает, как обычно строятся проекты и в соответствии с архетипом создает структуру каталогов.
Зависимость (dependency) - это те библиотеки, которые непосредственно используются в вашем проекте для компиляции кода или его тестирования.
Задача (goal) - это специальная задача, которая относится к сборке проекта и его управлению. Она может привязываться как к нескольким фазам, так и ни к одной. Задача, которая не привязана ни к одной фазе, может быть запущена вне фаз сборки с помощью прямого вызова.

Состоит из:


POM. Project object model. Модель проекта — в ней описано из чего проект состоит и как устроен его жизненный цикл.

Добавление библиотеки без Maven происходит
- Через командную строку java -classpath ./classes ru.аuthor.libname.Main

- Через среду разработки File -> Project Structure -> Project Settings -> Libraries -> +


2. Как добавлять зависимости с помощью Maven? Без помощи Maven?


Зависимость (dependency) - это те библиотеки, которые непосредственно используются в вашем проекте для компиляции кода или его тестирования.


Для решения задачи подключения сторонних библиотек в maven-проекте необходимо использовать зависимость dependency, устанавливаемые в файле pom.xml, где для каждого используемого в проекте артефакта необходимо указать :
параметры GAV (groupId, artifactId, version) и, в отдельных случаях, «необязательный» классификатор classifier;
области действия зависимостей scope (compile, provided, runtime, test, system, import);
месторасположение зависимости (для области действия зависимости system).

Значения идентификаторов groupId и artifactId подключаемых библиотек практически всегда можно найти на сайте www.mvnrepository.com.

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

  1. Поиск зависимостей в локальном репозитории Если зависимости не обнаружены, происходит переход к шагу 2.

  2. Поиск зависимостей в центральном репозитории. Если они не обнаружены и удалённый репозиторий определён, то происходит переход к шагу 4.

  3. Если удалённый репозиторий не определён, то процесс сборки прекращается и выводится сообщение об ошибке.

  4. Поиск зависимостей на удалённом репозитории, если они найдены, то происходит их загрузка в локальный репозиторий, если нет - выводится сообщение об ошибке.

Без Maven зависимости добавляются при помощи командной строки (java -classpath./classes «имя библиотеки», либо при помощи среды разработки (File->ProjectStructure-> +;
3. Жизненные циклы сборки проекта под управлением Maven (их всего 3). Из каких фаз они состоят? Рассказать о каждой фазе.

Жизненный цикл сборки(Lifecycle) - это чётко определённая последовательность фаз во время выполнения которых должны быть достигнуты определённые цели. Здесь фаза представляет собой стадию жизненного цикла.
Жизненные циклы Maven:

1.Clean (очистка) - очищает артефакты, созданные до сборки. Включает в себя 3 фазы:
- pre-clean
- clean
- post-clean



2.Default (build) (сборка) - это основной жизненный цикл Maven, который используется для сборки проектов. Он включает в себя 23 фазы:

3.
Site (цикл формированя отчетов) - генерирует документацию сайта для проекта.

Основные фазы из всех циклов:
1. Clean - очищает артефакты, созданные до сборки
2. Validate - должна проверяться корректность проекта, но как именно, решает программист, если ему это надо. (А если не надо, фаза validate пропускается).
3.
Compile – компилируются файлы с исходным кодом;
4. Test - тестирование с помощью JUnit тестоd
5.
Package — упаковываются скомпилированные файлы (в jar, war и т.д. архив);
6.
Verify — выполняются проверки для подтверждения готовности упакованного файла;
7.
Install — пакет помещается в локальный репозиторий. Теперь он может использоваться другими проектами как внешняя библиотека
8.
Site — создается документация проекта;
9.
Deploy — собранный архив копируется в удаленный репозиторий.

Фазы выполняются строго последовательно
Стандартные жизненные циклы могут быть существенно дополнены Maven-плагинами и Maven-архетипами.

4. Что такое JDBC? Какие классы/интерфейсы относятся к JDBC?

Java DataBase Connectivity — соединение с базами данных на Java — платформенно независимый промышленный стандарт взаимодействия Java-приложений с различными СУБД, реализованный в виде пакета java.sql, входящего в состав Java SE. JDBC основан на концепции так называемых драйверов, позволяющих получать соединение с базой данных по специально описанному URL.

4.1 Перечислите основные классы и интерфейсы JDBC.

java.sql.DriverManager - класс, позволяет загрузить и зарегистрировать необходимый JDBC-драйвер, а затем получить соединение с базой данных.

javax.sql.DataSource – интерфейс, решает те же задачи, что и DriverManager, но более удобным и универсальным образом. Существуют также
javax.sql.ConnectionPoolDataSource и javax.sq1.XADataSource задача которых - обеспечение поддержки пула соединений.

java.sql.Connection - обеспечивает формирование запросов к источнику данных и управление транзакциями. Также предусмотрены интерфейсы javax.sql.PooledConnection и javax.sql.XAConnection.

java.sql.Statement , java.sql.PreparedStatement и java.sql.CallableStatement - эти интерфейсы позволяют отправить запрос к источнику данных.

java.sql.ResultSet - объявляет методы, которые позволяют перемещаться по набору данных и считывать значения отдельных полей в текущей записи.

java.sql.ResultSetMetaData - позволяет получить информацию о структуре набора данных.

java.sql.DatabaseMetaData - позволяет получить информацию о структуре источника данных.

5.Для чего нужен DriverManager?

java.sql.DriverManager - класс, позволяет загрузить и зарегистрировать необходимый JDBC-драйвер, а затем получить соединение с базой данных.

Регистрацию драйвера можно осуществить несколькими способами:
java.sql.DriverManager.registerDriver(%объект класса драйвера%).
Class.forName(«полное имя класса драйвера»).newInstance().
Class.forName(«полное имя класса драйвера»);

Соединение (Connection) можно получить из Driver Manager при помощи метода .getConnection

6. Что такое Statement, PreparedStatement, CallableStatement?

Интерфейсы JDBC Statement, CallableStatement и PreparedStatement определяют методы и свойства, которые позволяют отправлять команды SQL или PL / SQL и получать данные из вашей базы данных.

Statement предназначен для выполнения простых SQL-запросов без параметров; содержит базовые методы для выполнения запросов и извлечения результатов.

PreparedStatement используется для выполнения SQL-запросов с или без входных параметров; добавляет методы управления входными параметрами.

CallableStatement используется для вызовов хранимых процедур; добавляет методы для манипуляции выходными параметрами.


(Храни́мая процеду́ра (англ. Stored procedure) — объект базы данных, представляющий собой набор SQL-инструкций, который компилируется один раз и хранится на сервере. Хранимые процедуры очень похожи на обыкновенные процедуры языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам.)

7. Что такое sql-injection?

Внедрение SQL-кода (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

И входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно — вычисления происходят по кратчайшему контуру в схеме).

8. Что такое ResultSet? Как с ним работать?

Интерфейс Java JDBC ResultSet представляет результат запроса к базе данных.

ResultSet представляет результирующий набор данных и обеспечивает приложению построчный доступ к результатам запросов. При обработке запроса ResultSet поддерживает указатель на текущую обрабатываемую строку.

Доступ к данным ResultSet обеспечивает посредством набора get-методов, которые организуют доступ к колонкам текущей строки. Метод ResultSet.next используется для перемещения к следующей строке ResultSet, делая ее текущей.

Методы ResultSet

absolute(int row) - Метод перемещает курсор на заданное число строк от начала, если число положительно, и от конца - если отрицательно

void afterLast() - Этот метод перемещает курсор в конец результирующего набора за последнюю строку

void beforeFirst() - Этот метод перемещает курсор в начало результирующего набора перед первой строкой

void deleteRow() - Удаляет текущую строку из результирующего набора и базы данных

int getRow() - Возвращает номер текущей строки

Statement getStatement() - Возвращает экземпляр Statement, который произвел данный результирующий набор

boolean next() - позволяют переместиться в результирующем наборе на одну строку вперед или назад

при использовании нужно отлавливать исключения вида SQLException

9. Рассказать про паттерн DAO.

Data Access Object (DAO) — широко распространенный паттерн для сохранения объектов бизнес-области в базе данных. В самом широком смысле, DAO — это класс, содержащий CRUD методы для конкретной сущности.

Паттерн DAO (The Data Access Object) предназначен для отделения взаимодействия с хранилищем данных от бизнес-логики приложения. Т.е. вся логика, отвечающая за сохранение, изменение, извлечение сущностей выносится в отдельные DAO-классы, а код, инкапсулирующий бизнес-логику приложения (т.н. сервисы), взаимодействует с этими классами, а не непосредственно с хранилищем данных.

Шаблон проектирования DAO или Data Access Object - хороший пример объектно-ориентированных принципов абстракции и инкапсуляции. Он отделяет логику сохраняемости от отдельного уровня, называемого уровнем доступа к данным, который позволяет приложению безопасно реагировать на изменения в механизме сохраняемости.

10. Что такое JPA?

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

10.1 Что такое ORM?

ORM (англ. Object-Relational Mapping, рус. объектно-реляционное отображение, или преобразование) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования.

10.2 Что такое Hibernate?

Hibernate — библиотека для языка программирования Java, предназначенная для решения задач объектно-реляционного отображения (ORM), самая популярная реализация спецификации JPA. Распространяется свободно на условиях GNU Lesser General Public License.
Позволяет сократить объёмы низкоуровневого программирования при работе с реляционными базами данных; может использоваться как в процессе проектирования системы классов и таблиц «с нуля», так и для работы с уже существующей базой.
Библиотека не только решает задачу связи классов Java с таблицами базы данных (и типов данных Java с типами данных SQL), но и также предоставляет средства для автоматической генерации и обновления набора таблиц, построения запросов и обработки полученных данных и может значительно уменьшить время разработки, которое обычно тратится на ручное написание SQL- и JDBC-кода. Hibernate автоматизирует генерацию SQL-запросов и освобождает разработчика от ручной обработки результирующего набора данных и преобразования объектов, максимально облегчая перенос (портирование) приложения на любые базы данных SQL.

10.3 В чем разница между JPA и Hibernate? Как связаны все эти понятия?

JPA это спецификация, а Hibernate - это ORM фреймворк/библиотека, которая совместима с JPA. Как и в классическом ООП, класс, который реализует интерфейс, может иметь дополнительные методы/свойства, так и Hiberante имеет больше фичей чем JPA.

11. Какие классы/интерфейсы относятся к JPA/Hibernate?

SessionFactory (org.hibernate.SessionFactory) - неизменяемый потокобезопасный объект с компилированным маппингом для одной базы данных. Необходимо инициализировать SessionFactory всего один раз. Экземпляр SessionFactory используется для получения объектов Session, которые используются для операций с базами данных.

Session (org.hibernate.Session) - однопоточный короткоживущий объект, который предоставляет связь между объектами приложения и базой данных. Он оборачивает JDBC java.sql.Connection и работает как фабрика для org.hibernate.Transaction. Разработчик должен открывать сессию по необходимости и закрывать ее сразу после использования. Экземпляр Session является интерфейсом между кодом в java приложении и hibernate framework и предоставляет методы для операций CRUD.


Transaction (org.hibernate.Transaction) - однопоточный короткоживущий объект, используемый для атомарных операций. Это абстракция приложения от основных JDBC или JTA транзакций. org.hibernate.Session может занимать несколько org.hibernate.Transaction в определенных случаях.

12. Основные аннотации Hibernate.

@Entity javax.persistence.Entity – для класса
@Table javax.persistence.Table - для класса (указывает, что в БД будет создана таблица хранящая объекты данного класса)
@Column javax.persistence.Table – для поля (указывает, что таблица будет содержать колонку с данными значениями)
@Id javax.persistence.Id – для поля (указывает, что данное поле будет значением-ключом для объектов в таблице)
@GeneratedValue javax.persistence.GeneratedValue – для @Id поля (указывает каким образом будет генерироваться значение-ключ при добавлении объектов)
@Version javax.persistence.Version
@OrderBy javax.persistence.OrderBy -Задает порядок элементов в момент извлечения ассоциации или коллекции.

13. Чем HQL отличается от SQL?

HQL (Hibernate Query Language) - это объекто-ориентированный язык запросов, который очень похож на SQL. Главное различие языков HQL и SQL связано с тем, что SQL формирует запросы из наименований таблиц в базе данных и их столбцов, а HQL работает с сущностями (классами) и их полями (аттрибутами класса).

14. Что такое Query? Как передать в объект Query параметры?

Класс позволяющий передавать HQL запросы. HQL запрос всегда начинается с получения объекта Query из Session вызовом метода createQuery(), в который передаётся текст запроса (String с запросом)

Параметры можно передать на заранее выделенные при создании экземпляра
Query места при помощи метода .setParametr. Место для параметра резервируется внутри HQL запроса при помощи “:parametrName” и заполнятся методом .setParametr(“parametrName”, value);

15. Какие можно устанавливать параметры в hbm2ddl.auto , рассказать про каждый из них.

validate : проверяет схему, не вносит изменений в базу данных.
update : обновляет схему.
create : создает схему, уничтожая предыдущие данные.
create-drop : удалить схему, когда SessionFactory закрывается явно, обычно, когда приложение остановлено.
none : ничего не делает со схемой, не вносит изменений в базу данных

16. Требования 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) Entity класс должен содержать первичный ключ, то есть атрибут или группу атрибутов которые уникально определяют запись этого Entity класса в базе данных.
17. Жизненный цикл Entity в Hibernate. Рассказать.

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

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

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

18. Для чего нужны Transaction.

Транзакции нужны для того, чтобы обеспечить целостность операций над БД. Если хотя бы один запрос из цепочки запросов не выполнится, не выполнится ни один и БД "откатится " к исходному состоянию.

19. Обязательны ли аннотации @Column и @Table?

Через аннотаци @Column можно явно указать поведение и имя столбца.
Без имени указанного в @
Table таблица будет именована в соответствии с именем Entity класса. Если откроете ее реализацию, то увидите, что столбцу можно задавать такие свойства, как уникальность, обновляемость и т.д.
Во всех остальных случаях, все поля в классе, помеченном как @Entity, неявно станут столбцами этой таблицы.
@Table — устанавливается на уровне класса и позволяет задать имя таблицы, каталог или схему базы данных, а также установить уникальные ключи. Если аннотация @Table не задана, то в качестве имени таблицы используется имя класса;
20. Как работает @GeneratedValue? Обязательна ли эта аннотация?

Если аннотация отсутствует, то JPA решит, что мы берем на себя задачу формирования и присваивания идентификатора при создании объекта на себя

Существует 4 варианта генерации первичных ключей

1. GenerationType.AUTO является типом генерации по умолчанию и позволяет поставщику персистентности выбрать стратегию генерации.
Если вы используете Hibernate в качестве поставщика персистентности, он выбирает стратегию генерации на основе конкретного диалекта базы данных. Для большинства популярных баз данных он выбирает GenerationType.SEQUENCE .

2. GenerationType.IDENTITY-самый простой в использовании, но не самый лучший с точки зрения производительности . Он опирается на автоматически увеличивающийся столбец базы данных и позволяет базе данных генерировать новое значение при каждой операции вставки. С точки зрения базы данных это очень эффективно, поскольку столбцы автоматического приращения сильно оптимизированы и не требуют никаких дополнительных операторов.
Этот подход имеет существенный недостаток, если вы используете Hibernate. Hibernate требует значения первичного ключа для каждой управляемой сущности и поэтому должен немедленно выполнить инструкцию insert. Этот предотвращает использование различных методов оптимизации, таких как пакетирование JDBC.

3. GenerationType.SEQUENCE использует последовательность базы данных для генерации уникальных значений. Для получения следующего значения из последовательности базы данных требуются дополнительные операторы select. Но это не имеет никакого значения воздействие для большинства применений .
Если вы не предоставите никакой дополнительной информации, Hibernate запросите следующее значение из последовательности по умолчанию. Вы можете изменить это , обратившись к имени @SequenceGenerator в генераторе атрибут аннотации @GeneratedValue . Аннотация @SequenceGenerator позволяет определить имя генератора, имя и схему последовательности базы данных, а также размер распределения последовательности.

4. GenerationType.TABLE используется очень редко . Он имитирует последовательность путем хранения и обновления ее текущего значения в таблице базы данных, которая требует использования пессимистических блокировок, которые ставят все операции в последовательном порядке. Это замедляет ваше приложение, и поэтому вы должны предпочесть GenerationType.SEQUENCE, если ваша база данных поддерживает последовательности, что делают большинство популярных баз данных.

21. Что такое @OneToOne(cascade = CascadeType.ALL)

Выражение, показывающее, что существующая связь между таблицами "один к одному" и операция над одной сущностью затрагивает все связанные с ней сущности.
Существуют следующие операции при которых может применяться Cascade:
1. ALL - любая операция над сущностью
2. PERSIST - операция сохранения
3. MERGE - объединения
4. REMOVE - удаления
5. REFRESH - обновления
6. DETACH – отсоединения

22. Области видимости зависимостей.

Области видимости (scope) зависимостей (dependency) в maven. Может быть указана в секции dependency файла pom.xml.

compile - область видимости по умолчанию. Используется, когда область видимости явно не указана. Компилирует зависимости, доступные во всех classpath проекта.
provided - эта область видимости очень похожа на compile, но показывает, что JDK или среда исполнения должна предоставить эти зависимости во время выполнения.
runtime - показывает, что зависимость не нужна для компиляции, но нужна во время выполнения.
test - показывает, что эти зависимости не нужны для работы приложения и используются только в фазе тестирования.
system - очень похожа на provided за исключением того, что вы предоставите архив, который содержит эту зависимость. Артефакт всегда доступен, поэтому его поиск в репозитории не производится.
import (Maven версии 2.0.9 или выше) - эта область видимости используется только в зависимости типа pom в секции . Она показывает, что указанный pom должен быть заменён зависимостями из pom'a, который указан в dependencyManagement.



написать администратору сайта