2013-07-12 3 views
0

У меня есть приложение, у которого есть таблица, и когда вы нажимаете на элемент в таблице, он заполняет группу текстовых полей своими данными (FieldGroup), а затем у вас есть возможность сохранить изменения Мне было интересно, как сохранить изменения, внесенные пользователем в мою базу данных postgres. Я использую vaadin и hibernate для этого приложения. До сих пор я пытался сделатьСохранить изменения в базе данных vaadin

editorField.commit() // after the user clicks the save button 

Я попытался

editorField.commit() 
    hbsession.persist(editorField) //hbsession is the name of my Session 

, и я также пытался

editorField.commit(); 
    hbsession.save(editorField); 

Последние два из них дают мне следующую ошибку

Caused by: org.hibernate.SessionException: Session is closed! 
+0

почему бы вам не попробовать jpacontainer аддон? –

+0

При использовании hibernate и vaadin вам понадобится шаблон entitymanager-per-request. ищите его в книге vaadin –

+0

Есть ли способ, которым я могу это сделать без JPAContianer, потому что Hibernate уже сделал все мои классы и XML-файлы, возможно ли это сделать с BeanItemContainer? – abden003

ответ

0

я понял, как внести изменения в базу данных здесь есть некоторый код, чтобы продемонстрировать:

try { 
    /** define the session and begin it **/ 
    hbsession = HibernateUtil.getSessionFactory().getCurrentSession(); 
    hbsession.beginTransaction(); 

    /** table is the name of the Bean class linked to the corresponding SQL table **/ 
    String query = "UPDATE table SET name = " + textfield.getValue(); 

    /** Run the string as an SQL query **/ 
    Query q = hbsession.createQuery(query); 
    q.executeUpdate(); /** This command saves changes or deletes a entry in table **/ 

    hbsession.getTransaction().commit(); 
} catch (RuntimeException rex) { 
    hbsession.getTransaction().rollback(); 
    throw rex; 
} 
4

Ну, первое, что вы необходимо понимать, что Ваадин отличается от обычной веб-структуры запроса/ответа. На самом деле, Vaadin is * Событие управляется * рамки очень похожи на Swing. Он создает контекст приложения с самого первого щелчка пользователя и удерживает его во время всего посещения сайта. Проблема в том, что нет точки запроса на вход, вы можете начать сеанс спящего режима и не отвечать на точку закрытия. Есть тонны запросов в течение одного нажатия кнопки.

Таким образом, entitymanager-for-request шаблон абсолютно бесполезен. Лучше использовать один автономный em или em-per-session шаблон с hibernate.connection_release after_transaction, чтобы поддерживать низкий пул соединений.

Для JPAContianer он не может использоваться, если вам нужно обновить контейнер, или вы должны обрабатывать bean-компоненты с отношениями. Кроме того, мне не удалось заставить его работать с пакетной загрузкой, поэтому каждое чтение записи или отношения равно единице, выбранной для БД. Не поддерживайте ленивую загрузку.

Все, что вам нужно, это открыть EM/session. Попытайтесь использовать предложенные шаблоны или открыть EM/сеанс каждой транзакции и сначала объединить свой bean-компонент.

Ваш вопрос является довольно сложным и трудно ответить, но я надеюсь, что эти ссылки помогут вам в:

стратегии связывания Pojo для спящего режима

https://vaadin.com/forum#!/thread/39712

MVP-облегченный

https://vaadin.com/directory#addon/mvp-lite (палка с ведомым событием)

+0

Не уверен в этом ответе ... Книга vaadin explicity говорит вам использовать шаблон entitymanager-per-request – guilhermecgs

Смежные вопросы