Бесплатный курс по Java: от основ до продвинутого уровня
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 запроса.