3

我正在努力学习vaadin。我真的很困惑如何使用持久性进行任何类型的应用程序开发,因为如果我引用了我的服务层对象,它们会存储在会话中,我真的不希望这样。持久性的东西是不可序列化的。

我的情况是我已经制作了一个使用 Spring 的应用程序,并且我正在使用 Vaadin 为它创建一个新的 UI。我可以将 spring 的东西注入我的 Vaadin 应用程序,但它会存储在会话中。有小费吗?

顺便问一下,您如何在 Vaadin 论坛上发帖?我找不到发布按钮或注册方式:)

4

5 回答 5

1

我的建议:

  • 将您的容器定义为仅包含演示数据。不要保留从演示对象到持久对象的任何直接引用。
  • 定义一个“加载”操作,在事务中加载持久数据对象并将它们转换为支持容器的相应表示对象。
  • 将所有容器设为只读(遵循模型-视图-控制器模式:容器即模型)
  • 根据需要设置通知/触发器,以便在底层持久数据更改时重新加载容器。
  • 对于可扩展性,设计或使用知道如何延迟加载的容器等,因此您不会一次填充整个容器(注意:困难TreeTable- 请参阅问题 #9516
于 2012-09-14T16:16:50.963 回答
1

你试过这个http://vaadin.com/directory#addon/enterprise-app。这个附加组件使用 spring 和 hibernate。

于 2012-11-16T05:13:34.607 回答
0

似乎 Vaadin 的书涵盖了这个问题。他们推荐的解决方案是使用 ThreadLocal 来存储 Service 对象。ThreadLocal 在 Application 类的 transactionStart 和 transactionEnd 中被初始化和销毁​​。

Vaadin 书中更详细的说明:http: //vaadin.com/book/-/page/advanced.global.html

于 2011-07-31T14:31:57.377 回答
0

我将休眠与 Vaadin 一起使用。我的主要应用程序类有一个会话工厂方法:

    public Session getSession() {
    Session currentSession = HibernateUtil.getSessionFactory()
            .getCurrentSession();
    if(!currentSession.getTransaction().isActive()) {
        currentSession.beginTransaction();
    }
    return currentSession;
}

每个需要持久化任何内容的类都将使用对主应用程序的引用,然后获取一个会话。

然后我有一个使用 HQL 命名查询的服务层,然后将该数据作为列表返回。

    public List<DataClass> getEntriesforDate(Date date, Integer key) {
    return mainApp.getSession().getNamedQuery(DataClass.NAMEDQUERY)
            .setParameter("key", key).list();
}

为了保存,您只需将一个 ORM 类映射到一个表,您填充该类的一个实例,然后使用合并来持久化对象:

getSession().merge(o);

这是来自 Vaadin Wiki 的详细解释:

与 Vaadin 一起休眠

于 2012-03-30T20:21:47.807 回答
-2

在 Vaadin 中,持久性数据不会存储在您的会话中,因此您无需担心这一点。

于 2010-12-31T21:45:26.053 回答