2010-08-11 147 views
3

我正在尝试学习vaadin。我真的很困惑如何做持久性的任何类型的应用程序开发,因为如果我有一个对我的服务层对象的引用,他们会存储在会话中,我真的不希望这样。持久性内容不可序列化。Vaadin持久性

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

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

+0

您必须注册才能发布论坛里的问题。点击页面顶部的“加入Vaadin”,它会将您带到登录屏幕,然后点击“创建帐户”并注册。登录后即可进入论坛,选择一个类别。在该页面上,搜索框旁边有一个“发布新帖子”按钮。 – 2010-08-13 11:16:02

+0

哦,没有看到加入Vaadin文本。它太小了:) – palto 2010-08-14 16:34:10

+0

你可以使用@Configurable,参见我自己的描述:http://info.michael-simons.eu/2013/03/12/vaadin-spring-using-configurable-in-vaadin-components/这些服务可以标记为瞬态并且在反序列化后再次自动装配。 – 2013-10-10 10:58:02

回答

0

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

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

-2

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

+0

对不起,我不明白。持久性数据如何不存储在会话中?如果应用程序存储在会话中,并且我的应用程序引用了EntityManager(JPA)或数据源,那么这些存储在哪里? – palto 2011-01-02 07:40:56

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的详细解释维基:

Hibernate with Vaadin

1

我的建议:

  • 将容器定义为仅包含演示文稿数据。不要将来自演示文稿对象的任何直接引用保留到持久对象中。
  • 定义一个“加载”操作,该操作在事务中加载持久数据对象并将它们转换为支持您的容器的相应表示对象。
  • 将所有容器设置为只读(遵循模型 - 视图 - 控制器模式:容器是模型)
  • 根据需要设置通知/触发器,以便在基础持久数据更改时重新加载容器。
  • 对于可扩展性,设计或使用的容器知道如何延迟加载等,这样你就不会在一次填充整个容器(注:与TreeTable困难的 - 见issue #9516
+0

这是一个古老的问题,现在我再次阅读,难怪我不断得到我没有的问题的答案:)这并不完全清楚我的实际问题是什么,所以在这里: 我的问题是您正在谈论的实际“负载”操作。要加载或持久化数据,我有一个处理持久性和事务的MyObjectRepository。要加载或持久化对象,我必须在我的Vaadin类中引用此MyObjectRepository。 MyObjectRepository的问题在于它不能被序列化,因为它具有数据库连接和所有其他的东西。 – palto 2012-09-17 06:21:29

+0

如果您使用的是Spring,请尝试[Spring Stuff](https://vaadin.com/directory#addon/spring-stuff)加载项。 – Archie 2012-09-17 13:59:13

+0

嘿,这似乎是一个优秀的图书馆!我必须尝试一下。 – palto 2012-09-19 07:39:04