Hibernate – один из самых известных инструментов объектно-реляционного сопоставления (ORM), который позволяет разработчику легко сопоставлять специализированные объекты Java, известные как Сущности, с таблицами базы данных, а также позволяет ему/ей создавать новые строки в таблицах базы данных и/или обновлять существующие с помощью этих объектов Java. Эта возможность значительно сокращает время разработки, поскольку теперь нам не нужно заботиться о каждой сложной детали того, как данные создаются, обновляются и удаляются в базе данных. И нет необходимости говорить, что такой потрясающий фреймворк, как Hibernate, обеспечивает гораздо больше, чем просто это.
В этом посте мы создадим простой Java-проект, чтобы начать работу с Hibernate. Но мы не будем использовать веб-фреймворк MVC, такой как Spring, поверх Hibernate, потому что использование любого другого фреймворка будет отвлекать от понимания самого Hibernate. Итак, мы создадим автономное приложение для гибернации и будем использовать JUnit для модульного тестирования каждой изучаемой нами функции гибернации. В качестве нашего первого примера мы будем вставлять запись в пользовательскую таблицу на локальном сервере MySQL. Так что давайте начнем!
Создайте проект Maven
Начните с создания проекта maven в вашей любимой IDE и отредактируйте pom.xml файл должен иметь следующие зависимости Hibernate, JUnit и MySQL (поскольку мы используем базу данных MySQL). Заключительный pom.xml файл будет выглядеть следующим образом:
4.0.0 com.jeetprksh hibernate-examples 1.0-SNAPSHOT hibernate-examples junit junit 4.11 test mysql mysql-connector-java 8.0.11 org.hibernate hibernate-core 5.2.10.Final
Настройка режима гибернации
Любому приложению, находящемуся в спящем режиме, потребуется минимальная конфигурация, указывающая ему, какую базу данных использовать и где ее искать. Мы настраиваем всю эту информацию в hibernate.cfg.xml
файл:
com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/testDB root qwerty123 10 true org.hibernate.dialect.MySQLDialect thread
Помимо наличия сведений о подключении к базе данных, он также содержит сведения о сопоставленных объектах. Нам нужно сохранить этот файл в каталоге ресурсов maven, чтобы он был у нас на пути к классу. Теперь в нашем приложении Java мы прочитаем эту конфигурацию, чтобы создать экземпляр SessionFactory, который будет использоваться для создания сеанса и управления им, который, в свою очередь, предоставляет интерфейс CRUD для сопоставленных объектов. Общий класс конфигурации Java был бы:
public class HibernateConfig { private static final SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; static { try { StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build(); Metadata metaData = new MetadataSources(standardRegistry).getMetadataBuilder().build(); sessionFactory = metaData.getSessionFactoryBuilder().build(); } catch (Exception e) { e.printStackTrace(); throw new ExceptionInInitializerError(e); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
Класс сущности
Класс entity – это специальный класс Java, который представляет таблицу базы данных в нашем приложении Java, и любая операция CRUD, которая нам нужна для этой таблицы базы данных, будет выполняться через этот класс entity. Поскольку нам нужно вставить запись в таблицу пользователя, мы создадим класс сущности пользователя, который будет выглядеть следующим образом:
@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String firstName; private String lastName; private int age; public User(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } // getters and setters }
Обратите внимание, что наш пользовательский класс использует следующие аннотации гибернации:
- Аннотация уровня класса
@Entity
, которая делает его Сущностью, сопоставленной с таблицей с аналогичным именем. Если имя класса сущности и имя таблицы должны отличаться, то мы можем указать имя таблицы в необязательном параметре аннотации как@Entity(name)
. - С помощью
@Id
аннотации к атрибуту id мы делаем его уникальным идентификатором для объекта User. @GeneratedValue
определяет, как будет генерироваться уникальный идентификатор при вставке новых записей в пользовательскую таблицу.
Создание слоя DAO
Объект доступа к данным будет единой точкой контакта для всего приложения для обновления и запроса записей в базу данных и из нее. В нашем случае модульные тестовые примеры будут использоваться в эти дни для того же самого. Поскольку нам нужно вставить пользовательскую сущность, соответствующий UserDao
будет выглядеть следующим образом:
public class UserDaoImpl extends CommonDaoImpl implements UserDAO { @Override public int createUser(User user) throws HibernateException { return super.saveEntity(user); } }
Обратите внимание, что UserDao
будет иметь только методы доступа к данным, специфичные для объекта User, поэтому, если у нас есть другой объект, скажем Адрес
, для этого потребуется свой собственный класс DAO, Адрессдао
. Но в наши дни мы зависим от более общего Common Dao
, который будет напрямую взаимодействовать с Hibernate для сохранения, запроса и обновления объектов.
public class CommonDaoImpl { private SessionFactory sessionFactory; private Session session; public CommonDaoImpl() { this.sessionFactory = HibernateConfig.getSessionFactory(); this.session = sessionFactory.getCurrentSession(); } protected int saveEntity(Object obj) throws HibernateException { Transaction transaction = session.beginTransaction(); int id = (Integer) session.save(obj); transaction.commit(); return id; } }
Каждый метод в этот ДЕНЬ будет отвечать за запуск транзакции для экземпляра объекта Session
, сохранение объекта на том же Сеанс
экземпляр, а затем зафиксируйте транзакцию.
Собирая Все Это Воедино
Наконец, мы настроили и внедрили все необходимые вещи, и теперь пришло время ввести последнюю часть, чтобы увидеть все это в действии, модульный тест.
public class Tests { private static final Logger logger = Logger.getLogger(Tests.class.getName()); private UserDAO userDao; public Tests() { this.userDao = new UserDaoImpl(); } @Test public void testInsertUser() { User user = new User("Robb", "Stark", 17); Integer id = (Integer) userDao.createUser(user); assertTrue(id instanceof Integer); } }
Обратите внимание, что для модульного тестирования пользователя insert наш модульный тестовый пример сначала создает объект User и передает его на уровень DAO, чтобы он был вставлен в базу данных. Уровень DAO вернет уникальный идентификатор только что вставленной записи, который мы будем использовать в качестве критерия прохождения/неудачи для этого модульного теста.
Код
Рабочий код был зафиксирован в этом репозитории github.
Эта статья уже опубликована в моем личном блоге .
Оригинал: “https://dev.to/jeetprakash/getting-started-with-hibernate-d4p”