Что такое JPA?
Что такое ORM?
Зачем использовать JPA?
Типы отношений JPA
Использование EntityManager и Spring Data JPA
Java Persistence API (JPA) – это стандарт Java для сопоставления объектов Java с реляционной базой данных.
JPA – это один из возможных подходов к ORM. С помощью JPA разработчик может сопоставлять, хранить, обновлять и извлекать данные из реляционных баз данных в объекты Java и наоборот.
JPA может использоваться в приложениях Java-EE и Java-SE. JPA может использоваться в приложениях Java-EE и Java-SE.
Объектно–реляционное сопоставление является основой JPA, которая заключается в представлении и доступе к данным в виде простых объектов Java, называемых сущностями.
Hibernate, EclipseLink и Apache OpenJPA – это некоторые из реализаций JPA, из которых Hibernate является более популярным и широко используемым.
Чтобы уменьшить нагрузку на написание кодов для управления реляционными объектами корпоративного приложения, программист следует фреймворку поставщика JPA (реализация JPA), которая позволяет легко взаимодействовать с экземпляром базы данных.
В реляционной базе данных отношения между двумя таблицами определяются внешними ключами. Как правило, в одной таблице есть столбец, содержащий первичный ключ строки другой таблицы.
В JPA мы имеем дело с объектами сущностей, которые являются Java-представлениями таблиц базы данных. Поэтому нам нужен другой способ установления отношений между двумя сущностями.
Отношения сущностей JPA определяют, как эти сущности ссылаются друг на друга.
Отношения “один к одному”
Аннотация @OneToOne используется для определения отношения “один к одному” между двумя объектами.
Например, у вас может быть объект User , содержащий имя пользователя, адрес электронной почты и пароль, но вы можете захотеть сохранить дополнительную информацию
Аннотация @OneToOne облегчает разбивку ваших данных и объектов таким образом.
Приведенный ниже класс User имеет один экземпляр User Profile . Профиль пользователя сопоставляется с одним экземпляром Пользователя .
@Entity public class User { @Id private Integer id; private String email; private String name; private String password; @OneToOne(mappedBy = "user") private UserProfile profile; ... }
@Entity public class UserProfile { @Id private Integer id; private int age; private String gender; private String favoriteColor; @OneToOne private User user; ... }
Поставщик JPA использует поле user Профиля пользователя для сопоставления Профиля пользователя с Пользователем. Сопоставление указано в атрибуте mappedBy в аннотации @OneToOne .
Отношения “один ко многим” и “многие к одному”
The @OneToMany и @ManyToOne аннотации облегчайте обе стороны одних и тех же отношений.
облегчайте обе стороны одних и тех же отношений.
Сущность книги определила бы @ManyToOne отношения с автором и Сущность книги определила бы @ManyToOne отношения с автором и
@Entity public class Book { @Id private Integer id; private String name; @ManyToOne @JoinColumn(...) ... }
@Entity public class Author { @Id @GeneratedValue private Integer id; private String name; @OneToMany(mappedBy = "author") private Listbooks = new ArrayList<>(); ... }
В этом случае класс Author поддерживает список всех книг, написанных этим автором, а класс Book поддерживает ссылку на своего единственного автора.
Кроме того, @JoinColumn указывает имя столбца в таблице Book для хранения идентификатора Автора.
Отношения “многие ко многим”
Наконец, аннотация @ManyToMany облегчает связь “многие ко многим” между сущностями. Вот случай, когда объект Book имеет нескольких авторов:
@Entity public class Book { @Id private Integer id; private String name; @ManyToMany @JoinTable(name = "BOOK_AUTHORS", joinColumns = @JoinColumn(name = "BOOK_ID"), inverseJoinColumns = @JoinColumn(name = "AUTHOR_ID")) private Listauthors = new ArrayList<>(); ... }
@Entity public class Author { @Id @GeneratedValue private Integer id; private String name; @ManyToMany(mappedBy = "author") private Listbooks = new ArrayList<>(); ... }
В этом примере мы создаем новую таблицу BOOK_AUTHORS с двумя столбцами: BOOK_ID и AUTHOR_ID.
Используя атрибуты joinColumns и inverseJoinColumns, укажите вашей платформе JPA, как сопоставить эти классы в отношениях “многие ко многим”.
Аннотация @ManyToMany в классе Author ссылается на поле в классе Book , которое управляет отношениями, а именно на свойство Автора.
Entity Manager – это компонент в спецификациях JPA, который является передней частью фреймворка. Entity Manager отвечает за хранение и извлечение сущностей.
Давайте посмотрим на пример кода ниже.
@Component public class BookDao { @Autowired EntityManager entityManager; public void addUser(Book book) { entityManager.persist(book); } public void updateUser(Book book) { Book dbBook = entityManager.find(Book.class, book.getId()); dbBook.setAutherName(book.getAutherName()); entityManager.persist(dbBook); } public Book getBookById(Long id) { return entityManager.find(Book.class, id); } public void deleteBook(Long id) { Book book = entityManager.find(Book.class, id); entityManager.remove(book); } }
Давайте перепишем тот же пример CRUD для Book table. Нет необходимости писать методы addUser(), UpdateUser() и т.д., Потому что методы уже существуют в интерфейсе JpaRepository.
@Repository public interface BookRepository extends JpaRepository{ Book save(Book book); Optional findById(Long id); void deleteById(Long id); }
Вам не нужно предоставлять какую-либо реализацию, потому что Spring предоставляет реализацию во время выполнения.
Методы, объявленные в интерфейсах репозитория, называются методами запроса.
Основываясь на имени, параметрах и типах возвращаемых методов, Spring знает, что вы хотите сделать, и готовит фактические инструкции SQL под капотом.
Я покажу вам полный пример проекта в следующей статье.
Оригинал: “https://dev.to/reytech-lesson/what-is-jpa-589f”