HQL: обновление данных (Update)
Last updated: 11 мая 2025 г.Если мы извлекли из таблицы строку в объект, а потом изменили его с помощью например сеттера, то после коммита транзакции он измениться и в базе.
1package HibernateApps;
2
3import java.util.List;
4import org.hibernate.Session;
5import org.hibernate.SessionFactory;
6import org.hibernate.cfg.Configuration;
7
8public class HibernateApp {
9
10 public static void main(String[] args) {
11 SessionFactory sessionfactory = new Configuration()
12 .configure("hibernate.cfg.xml")
13 .addAnnotatedClass(Book.class)
14 .buildSessionFactory();
15 Session session = sessionfactory.getCurrentSession();
16 try {
17 session = sessionfactory.getCurrentSession();
18 session.beginTransaction();
19 //извлекаем строку с ключем 2 в объект Book
20 Book LOTRBook = session.get(Book.class, 2);
21 //меняем имя книги с помощью сеттера
22 LOTRBook.setBookName("Lord Of The Rings");
23 //и сразу коммитим. после этого строка
24 //таблицы с ключем 2 тоже должна измениться
25 session.getTransaction().commit();
26 //создаем новую сессию и транзакцию
27 session = sessionfactory.getCurrentSession();
28 session.beginTransaction();
29 //извлекаем еще раз
30 Book LOTRBook1 = session.get(Book.class, 2);
31 //выведем извлеченную книгу на консоль
32 System.out.println(LOTRBook1.toString());
33 session.getTransaction().commit();
34 } catch (Exception e) {
35 //откатываем изменения в бд
36 //если при транзакции случилась ошибка
37 session.getTransaction().rollback();
38 e.printStackTrace();
39 } finally{
40 //по окончании работы с сессией закрываем ее
41 session.close();
42 }
43 }
44
45 private static void showBooks(List<Book> books) {
46 for(Book tempBook : books) {
47 System.out.println(tempBook.toString());
48 }
49 }
50}
Давайте запустим нашу программу.

В последней строке видим название 2 книги изменилось после первого коммита и в базе. То есть мы просто меняем объект, который мы предварительно извлекли из базы и после коммита он меняется и в базе.
Довольно удобно, в sql пришлось бы писать команду update
Update таблицы с помощью запроса
Также можно обновлять строки таблицы запросом. То есть нам, например, может понадобиться обновить несколько строк таблицы и не очень будет удобно доставать эти строки, помещать их в объекты изменять их, а потом коммитить, чтобы они изменились в базе, как в прошлом примере. Проще сделать один запрос.
1package HibernateApps;
2
3import java.util.List;
4import org.hibernate.Session;
5import org.hibernate.SessionFactory;
6import org.hibernate.cfg.Configuration;
7
8public class HibernateApp {
9
10 public static void main(String[] args) {
11 SessionFactory sessionfactory = new Configuration()
12 .configure("hibernate.cfg.xml")
13 .addAnnotatedClass(Book.class)
14 .buildSessionFactory();
15 Session session = sessionfactory.getCurrentSession();
16 try {
17 //Update нескольких строк таблицы запросом.
18 session = sessionfactory.getCurrentSession();
19 session.beginTransaction();
20 // устанавливаем значение bookName равным Hobbit
21 // в строках таблицы где id равен 1 и 2
22 session.createQuery("update Book set bookName='" +
23 "Hobbit’ where id=1 or id=2").executeUpdate();
24 //извлечем строки таблицы для проверки
25 List<Book> books3 = session.createQuery(
26 "from Book").getResultList();
27 session.getTransaction().commit();
28 //проверим содержимое books3
29 showBooks(books3);
30 }
31 catch (Exception e) {
32 //откатываем изменения в бд
33 //если при транзакции случилась ошибка
34 session.getTransaction().rollback();
35 e.printStackTrace();
36 }
37 finally {
38 //по окончании работы с сессией закрываем ее
39 session.close();
40 }
41 }
42
43 private static void showBooks(List<Book> books) {
44 for(Book tempBook : books) {
45 System.out.println(tempBook.toString());
46 }
47 }
48}
Давайте запустим нашу программу.

Как видим, обе строки таблицы были изменены успешно с помощью Update
запроса.
Следующие уроки
HQL: удаление данных (Delete)
16
мин.
Настройка связей в Hibernate приложении
21
мин.
Двусторонняя связь между сущностями в Hibernate
20
мин.