保存对数据库vaadin的更改

时间:2013-07-12 21:40:21

标签: java hibernate postgresql vaadin save

我有一个有一个表格的应用程序,当你点击表格中的一个项目时,它会填充一组包含其数据(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!

2 个答案:

答案 0 :(得分:4)

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

因此, entitymanager-per-request 模式完全没用。最好使用一个独立的em或 em-per-session 模式和hibernate.connection_release after_transaction来保持连接池的低电平。

对JPAContianer来说,只要您需要刷新容器或者必须处理具有关系的bean,它就无法使用。此外,我没有设法让它使用批量加载,因此每个条目或关系的读数等于一个选择到DB。不支持延迟加载。

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

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

hibernate的Pojo绑定策略

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

<强> MVP-精简版

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

答案 1 :(得分: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;
}