observer模式-使Groovy泛型列表Observable



我使用的是ObjectDB,但也想让持久化对象中的集合变得可观察,所以我这样声明它:

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) List<Widget> widgets = [] as ObservableList

稍后,我创建了一个监听器闭包并将其附加:

    def widgetChangeListener = {
        log.debug "WIDGET CHANGE: $it"
    }
    widgets.addPropertyChangeListener(widgetChangeListener)

然而,当我尝试持久化集合时,我会得到以下错误:

Attempt to store an instance of a non persistable type com.greymatter.strategy.Harness$_closure1 - field com.greymatter.strategy.Harness.widgetChangeListener (error 303)

有没有办法让这个集合持久化,同时保持闭包的不稳定,这样我就可以观察到它的变化?ObjectDB有一个@Transient注释,但我不知道如何将其应用于闭包。如果我把它放在widgetChangeListener的def上,我会得到一个MissingMethodException。

ObjectDB和ObservableList互斥吗?

Groovy集合不完全受ObjectDB(以及JPA)的支持。请参阅本ObjectDB手册页面上JPA/ObjectDB中支持的集合列表。

如果ObservableList工作良好,除了侦听器之外,您可以在持久化或更新实体对象之前使用JPA生命周期事件来清除侦听器(然后在必要时将其设置回)。

或者,您可以在实体类中保留2个列表字段。将被持久化的普通列表,以及将被设置为瞬态的该列表的ObservableList包装器。

最新更新