1

我对 a 的设计有疑问VetoableChangeListener。我实现了VetoableChangeListener接口来监听模型类中属性的变化,所以当模型触发时

vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException

…我尝试将更改保存在数据库中,这可能会失败(SQLException例如,通过)。如果失败,我会抛出一个PropertyVetoException来恢复模型中的更改。

该模型在一个VetoableChangeSupport(JDK类)中进行委托,当它接收PropertyVetoException到它并通知恢复到ALL时VetoableChangeListener,使用oldValue/newValue交换(后来它重新抛出异常),以便事件再次出现在我的类中,我尝试再次保存在数据库中,等等......

我有一个解决方法,即模型在没有人抛出 a 之前不会改变PropertyVetoException,所以在VetoableChangeListener我首先检查我要保存在数据库中的数据是否不等于模型中的数据,如果它相等我只需忽略更改。

还有其他更好的解决方法吗?

4

3 回答 3

1

您的“解决方法”并不是真正的解决方法,但实际上对我来说听起来像是正确的解决方案:在尝试“更改”持久版本之前确认对象的当前状态实际上发生了变化。这也将更加有效(数据库访问成本很高)。

于 2008-10-26T14:45:58.960 回答
0

You should check the Vetoable change before you change the model, not after...

ie: if there is a problem, the model is not changed, not revert the model if the change was wrong

于 2008-09-23T12:36:47.870 回答
0

收件人:timyates

这正是我所做的,我接收事件,尝试更新数据库,但它失败了,我抛出异常否决更改,因此模型没有更新,但问题是 VetoableChangeSupport 通知我我自己的否决权,如果我不执行我在问题中解释的解决方法,请进入 bucle

于 2008-09-23T18:06:04.413 回答