制作一个Groovy通用列表Observable

时间:2014-04-27 21:25:30

标签: groovy observer-pattern objectdb

我正在使用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是否互斥?

1 个答案:

答案 0 :(得分:1)

ObjectDB(以及JPA)不完全支持Groovy集合。请参阅this ObjectDB Manual page上的JPA / ObjectDB中支持的集合列表。

如果ObservableList运行良好,除了侦听器之外,您可以在持久化或更新实体对象之前使用JPA lifecycle events清除侦听器(然后在必要时将其设置回来)。

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