Вызов session.flush()
приведет к тому, что операторы SQL будут сгенерированы для всех внесенных вами изменений, и эти операторы SQL будут выполнены в базе данных в рамках транзакции sessios.
Car car = (Car) session.get(Car.class, 1);
car.setModel("Mustang");
session.flush();
Последняя строка вызовет оператор UPDATE
в базе данных. Однако, в зависимости от того, как вы обрабатываете транзакции в своих приложениях, это изменение может быть невидимым для других пользователей, прежде чем вы совершите транзакцию, удерживаемую разделом.
Хотя очистка на самом деле не является двунаправленной операцией, ее можно использовать для обеспечения того, чтобы автоматически сгенерированный идентификатор был назначен новому объекту сущности. Если класс Car
сопоставлен с таблицей базы данных с автоматически увеличивающимся идентификатором, вы можете использовать сброс, чтобы убедиться, что этот идентификатор доступен для объекта домена в коде вашего приложения:
Car car = new Car();
car.setModel("Torino");
session.save(car);
System.out.println(car.getId()); // prints 0
session.flush();
System.out.println(car.getId()); // prints something larger than 0
Скажем, вы хотите отправить электронное письмо со ссылкой на недавно созданный автомобиль (хорошо, учетная запись пользователя имела бы больше смысла), но если письмо не может быть отправлено, вы хотите откатить транзакцию. Сброс сеанса позволяет вам сделать это.