HQL запросы в Hibernate. Обновление данных (Update)

Если мы извлекли из таблицы строку в объект, а потом изменили его с помощью например сеттера, то после коммита транзакции он измениться и в базе.

package HibernateApps; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateApp { public static void main(String[] args) { SessionFactory sessionfactory = new Configuration() .configure(“hibernate.cfg.xml”) .addAnnotatedClass(Book.class) .buildSessionFactory(); Session session = sessionfactory.getCurrentSession(); try { session = sessionfactory.getCurrentSession(); session.beginTransaction(); //извлекаем строку с ключем 2 в объект Book Book LOTRBook = session.get(Book.class, 2); //меняем имя книги с помощью сеттера LOTRBook.setBookName(“Lord Of The Rings”); //и сразу коммитим. после этого строка //таблицы с ключем 2 тоже должна измениться session.getTransaction().commit(); //создаем новую сессию и транзакцию session = sessionfactory.getCurrentSession(); session.beginTransaction(); //извлекаем еще раз Book LOTRBook1 = session.get(Book.class, 2); //выведем извлеченную книгу на консоль System.out.println(LOTRBook1.toString()); session.getTransaction().commit(); } catch (Exception e) { //откатываем изменения в бд //если при транзакции случилась ошибка session.getTransaction().rollback(); e.printStackTrace(); } finally{ //по окончании работы с сессией закрываем ее session.close(); } } private static void showBooks(List books) { for(Book tempBook : books) { System.out.println(tempBook.toString()); } } }

Давайте запустим нашу программу.

В последней строке видим название 2 книги изменилось после первого коммита и в базе. То есть мы просто меняем объект, который мы предварительно извлекли из базы и после коммита он меняется и в базе.

Довольно удобно, в sql пришлось бы писать команду update


Update таблицы с помощью запроса

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

package HibernateApps; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateApp { public static void main(String[] args) { SessionFactory sessionfactory = new Configuration() .configure(“hibernate.cfg.xml”) .addAnnotatedClass(Book.class) .buildSessionFactory(); Session session = sessionfactory.getCurrentSession(); try { //Update нескольких строк таблицы запросом. session = sessionfactory.getCurrentSession(); session.beginTransaction(); // устанавливаем значение bookName равным Hobbit // в строках таблицы где id равен 1 и 2 session.createQuery(“update Book set bookName='” + “Hobbit’ where id=1 or id=2”).executeUpdate(); //извлечем строки таблицы для проверки List books3 = session.createQuery( “from Book”).getResultList(); session.getTransaction().commit(); //проверим содержимое books3 showBooks(books3); } catch (Exception e) { //откатываем изменения в бд //если при транзакции случилась ошибка session.getTransaction().rollback(); e.printStackTrace(); } finally { //по окончании работы с сессией закрываем ее session.close(); } } private static void showBooks(List books) { for(Book tempBook : books) { System.out.println(tempBook.toString()); } } }

Давайте запустим нашу программу.

Как видим, обе строки таблицы были изменены успешно с помощью Update запроса.

HQL: удаление данных (Delete)

Удаление данных в Hibernate: методы delete() и HQL-запросы. Практические примеры удаления как отдельных строк, так и групп записей из базы данных.
Time to read: 16

Настройка связей в Hibernate приложении

Узнайте, как настроить связи 1-к-1, 1-ко-многим и многие-ко-многим в Hibernate. Каскадные операции PERSIST и REMOVE для связанных сущностей с примерами кода.
Time to read: 21

Двусторонняя связь между сущностями в Hibernate

Реализуйте двустороннюю связь между сущностями в Hibernate. Узнайте, как настроить взаимодействие между объектами с помощью аннотаций @OneToOne и mappedBy.
Time to read: 20