0

我有一个应用程序,它有一个表格,当您单击表格中的一个项目时,它会使用其数据(FieldGroup)填充一组文本字段,然后您可以选择保存更改我想知道如何保存用户对我的 postgres 数据库所做的更改。我正在为这个应用程序使用 vaadin 和 hibernate。到目前为止,我已经尝试过

   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!
4

2 回答 2

4

嗯,您需要意识到的第一件事是 Vaadin 与传统的请求/响应 Web 框架不同。实际上,Vaadin 是 *事件驱动*框架,与 Swing 非常相似。它从用户的第一次点击构建一个应用程序上下文,并在整个网站访问期间保持它。问题是没有可以启动休眠会话的入口请求点,也没有可以关闭的响应点。在单击按钮期间有大量请求。

所以,entitymanager-per-request模式是完全没用的。最好使用一个独立的 em 或em-per-session模式和 hibernate.connection_release after_transaction 以保持连接池较低。

对于 JPAContianer,它不可用,因为您需要刷新容器或者您必须处理具有关系的 bean。此外,我没有设法让它与批处理加载一起工作,因此每次读取条目或关系都等于对 DB 的一次选择。不支持延迟加载。

您所需要的只是打开 EM/会话。尝试使用建议的模式或在每个事务中打开 EM/会话并首先合并您的 bean。

您的问题非常复杂且难以回答,但我希望这些链接可以帮助您了解:

休眠的 Pojo 绑定策略

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

MVP精简版

https://vaadin.com/directory#addon/mvp-lite(坚持事件驱动模式)

于 2013-07-24T23:22:24.757 回答
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;
}
于 2013-07-25T22:54:24.237 回答