Мой предыдущий вопрос Как обернуть отображение страницы Wicket в транзакции Spring / Hibernate? заставило меня задуматься о разграничении транзакций в Wicket.
Хотя этот пример был легко решен путем перемещения бизнес-логики на уровень, управляемый Spring, в других местах это невозможно.
У меня есть общий класс DAO, реализованный с помощьюHibernate, с
public class HibernateDAO<T> implements DAO<T> {
protected final Class<T> entityClass;
private final SessionFactory sessionFactory;
@Transactional
public T load(Serializable id) {
return (T) getSession().get(entityClass, id);
}
@Transactional
public void saveOrUpdate(T object) {
getSession().saveOrUpdate(object);
}
}
и общей моделью для его извлечения
public class DAOEntityModel<T> extends LoadableDetachableModel<T>{
private DAO<T> dao;
private final Serializable id;
public DAOEntityModel(DAO<T> dao, Serializable id) {
this.dao = dao;
this.id = id;
}
public <U extends Entity> DAOEntityModel(DAO<T> dao, U entity) {
this(dao, entity.getId());
}
public Serializable getId() {
return id;
}
@Override
protected T load() {
return dao.load(id);
}
}
Теперь у меня есть минимальная форма, которая меняет сущность
public class ScreenDetailsPanel extends Panel {
@SpringBean(name="screenDAO") private DAO<Screen> dao;
public ScreenDetailsPanel(String panelId, Long screenId) {
super(panelId);
final IModel<Screen> screenModel = new DAOEntityModel<Screen>(dao, screenId);
Form<Screen> form = new Form<Screen>("form") {
@Override protected void onSubmit() {
Screen screen = screenModel.getObject();
dao.saveOrUpdate(screen);
}};
form.add(
new TextField<String>("name", new PropertyModel<String>(screenModel, "name")));
add(form);
}
}
Покахорошо - спасибо за поддержку!
Итак, моя проблема в следующем - когда форма отправлена, PropertyModel загрузит screenModel, что произойдет в транзакции, описанной @Transactional dao.load (id),Фиксация изменений произойдет, когда (другая) транзакция, запущенная для dao.saveOrUpdate (object), будет зафиксирована.В промежутке между этими периодами все ставки отключены, так что объект может больше не существовать в БД для фиксации.
Я никогда не до конца уверен с кодом БД и транзакциями.Должен ли я просто отмахнуться от этого, как от маловероятного, хотя я мог бы построить другие более сложные, но более опасные сценарии?Если нет, я не вижу, как разграничить логику всей страницы в одной транзакции, к чему мой инстинкт подсказывает мне, к чему я должен стремиться.