如何在基于Wicket,Spring,Hibernate的Web应用程序中正确使用LoadableDetachableModel?

我正在开发一个基于Hibernate,
Spring和Wicket的Web应用程序.

到目前为止,我实现了业务对象和持久层.该事务由Spring框架的事务拦截器管理.因此,DAO类的每个方法都封装在一个事务中.与单元测试一起实现这一点是直截了当的.

现在我来到Web应用程序部分,我也使用Spring进行依赖注入.与Wicket框架的@SpringBean注释一起,我在Wicket组件中注入了DAO.但是因为我对Wicket很新,所以在传递它们时使用正确的模型为我的业务对象时,我会有点卡住Wicket组件.

我尝试了LoadableDetachableModel但遇到了一些问题.我有一个页面来创建新的或编辑现有的业务对象,具体取决于页面的输入参数.如果参数中有id,则应从数据库加载相应的业务对象.如果没有参数,则应创建新的业务对象.该部分是一个应该被编辑的对象运行得相当好但是当应该创建一个新对象时,我填写Web表单并按下save,我得到一个NullPointerException.经过一些调试后,我发现LoadableDetachableModel无法返回业务对象的实例,因为重写的load()方法无法从数据库加载对象,因为它尚未保存,因此没有id.

所以现在我想知道如何解决这个问题. LoadableDetachableModel是正确的选择吗?是否可以将表单分成两个相互依赖的形式,每个表单使用不同的模型.所以只有编辑页面/表单使用LoadableDetachableModel?

最佳答案 Igor Vaynberg在
the Wicket In Action blog对此以及一些相关问题进行了很好的解释.

该页面的最后一位处理此问题,基本上不使用LoadableDetachableModel,而是实现AbstractEntityModel,它允许更完整的控制.

点赞