У меня нестандартная ситуация, когда мне нужно обновить объект внутри транзакции readOnly Hibernate. Дело в том, что я загружаю много других объектов, меняю их в рамках этой транзакции, но нужно сохранить только один, остальное откат. База данных, над которой я работаю - Postgresql 8.4
Я не уверен, что правильно понимаю документы, но делаю способ обслуживания:
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
должно привести к открытию новой транзакции RW для этого сохранения.
Главное, это не работает:
@Transactional(readOnly = true)
public class PersonService {
@Resource(name="sessionFactory")
private SessionFactory sessionFactory;
public void add(Person person){
person.setFirstName("changed its name");
save(person);
}
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void save(Person person) {
Session session = sessionFactory.getCurrentSession();
session.save(person);
session.flush();
}
}
После этого я получаю
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
Из контроллера вызовите метод add. add находится в режиме readOnly и передает объект Person методу save, который должен открыть новую транзакцию и сохранить в БД. В моем проекте в методе «add» у меня загружено много других объектов «Person», которые не должны быть сохранены.
Причина, по которой мне нужен метод readOnly, заключается в том, что я загружаю еще больше объектов в коде :) Откат их - последнее, что я хочу сделать.
Можно ли сделать это таким образом?