JPA & HIBERNATE

186
09 июля 2018, 03:50

Здравствуйте скажите пожалуйста в чем разница между JPA и HIBERNATE и если не сложно скажите что такое HIBERNATE и что такое JPA

Answer 1

JPA - это стандарт ORM, а Hibernate - это одна из его реализаций.

UPDATE:

Постараюсь как можно более просто. Для начала о том, что такое ORM. Данные в реляционных базах хранятся в таблицах.

 id | name | age
-----------------
  1 | Jack | 24
  2 | John | 31

Если отбросить нюансы, то при выборке этих данных из базы в программу с помощью JDBC получается двумерный "массив" - массив строк таблицы, каждая из которых представляет массив колонок таблицы. Неудобная для работы структура. Java-программистам намного удобнее работать с объектами.

class Person {
    long id;
    String name;
    int age;
    // Модификаторы доступа, конструкторы
    // и аксессоры опущены для краткости
}

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

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/somedatabase",
                                              "someuser",
                                              "somepassword");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select id, name, age from persons");
List<Person> persons = new ArrayList<>();
while (rs.next()) {
    Person person = new Person();
    person.setId(rs.getLong("id"));
    person.setName(rs.getString("name"));
    person.setAge(rs.getInt("age"));
    persons.add(person);
}
rs.close();
conn.close();

Это называется mapping. Но, во-первых, у всех таблиц разная структура и надо под каждую писать маппер, во-вторых, надо писать запросы в базу на языке SQL, в-третьих, надо самому создавать структуру таблиц. А если на каком-то из этих этапов запутался, компилятор не заметит и программа упадёт при выполнении. К тому же, надо ведь данные ещё и обратно в базу сохранять, извлекать данные из объекта, формировать запрос, выполнять его. Неудобно. Вот бы просто описать класс, а потом запустить какой-нибудь универсальный маппер, чтобы он сам создал таблицу под этот класс и сам конвертировал данные между таблицей и объектами. Такой универсальный маппер и есть ORM.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersonUnit");
EntityManager entityManager = emf.createEntityManager();
List<Person> persons = entityManager.createQuery("from Person", Person.class)
                                    .getResultList();

Чтобы объяснить разницу между стандартом JPA и его реализацией Hibernate прибегну к аналогиям. Стандарт - это схема, описывающая общие принципы работы. Например, схема грузовика описывает, что у грузовика должны быть колёса, кабина, кузов, двигатель, вращение руля должно поворачивать колёса, а нажатие на педаль тормоза останавливать грузовик. Реализация - это конкретное решение выполненное по схеме - ЗИЛ-131, Камаз-43501 и т.п. Преимущество реализации выполненной по стандарту в том, что программист/водитель может легко сменить одну реализацию/грузовик на другую, не тратя время и силы на переобучение.

На сегодняшний день JPA реализуют Hibernate, EclipseLink, OpenJPA и DataNucleus. Широко применяются первые два, а эталонной реализацией считается Hibernate.

READ ALSO
Как найти нужный мне метод java\android?

Как найти нужный мне метод java\android?

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

209
Как расположить Div по центру при помощи margin?

Как расположить Div по центру при помощи margin?

Всем привет! Хочу сделать окошко по центру (очень заезжанная тема), но при помощи margin'а не получается(Я гуглил, ничего путного не нагуглил

193
Как плавно изменить размер картинки в блоке?

Как плавно изменить размер картинки в блоке?

Продолжаю учиться верстке и хочу сделать такую штуку:

219
Почему не срабатывает событие onfullscreenchange при нажатии F11?

Почему не срабатывает событие onfullscreenchange при нажатии F11?

Такой код реагирует на requestFullscreen и cancelFullScreen, но если нажимать F11 консоль остается пустой

168