Здравствуйте скажите пожалуйста в чем разница между JPA и HIBERNATE и если не сложно скажите что такое HIBERNATE и что такое JPA
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.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости