Рубрики
Без рубрики

Что такое JPA?

Что такое JPA? Что такое JPA? Зачем использовать JPA? Зачем использовать JPA? Зачем использовать JPA?

  • Что такое 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 List books = 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 List authors = new ArrayList<>();
    ...
}
@Entity
public class Author {

    @Id
    @GeneratedValue
    private Integer id;

    private String name;

    @ManyToMany(mappedBy = "author")
    private List books = 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”