2

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

4

1 回答 1

1

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

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

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

于 2014-04-27T23:41:57.207 回答