java-与休眠的Struts2 xwork类型转换

在Struts2应用程序中转换类型的最佳方法是什么?

现在,我想为我的应用程序中的某个休眠实体创建CRUD.假设我想更改与用户关联的帐户.只要我具有所有适当的获取器/设置器,我就可以传递带有特定值的参数user.account.id.

第一次创建对象(帐户为空)时,这可以很好地工作.这使ognl创建了一个新的帐户对象,并将ID设置为传入的对象.

尝试更改封装的Account对象时,会发生此问题.使用相同的user.account.id参数,ognl将此解释为getUser().getAccount().setId(param). Hibernate将此解释为尝试更改主键.

我知道为什么会这样做,我只是想知道是否有更好的方法来处理这种情况.这在我们的应用程序中很常见,我不需要在通过休眠保存它们之前继续创建多个对象并将其编组.

没有人在struts2中有更好的方法来解决此问题吗?

解决方法:

持久性类型转换器

为实体创建类型转换器,然后仅传递user.account而不是user.account.id.这将调用getUser().setAccount(account),不会使您头痛.

更新记录时,只需将user.account传递为表单中的隐藏字段.

至于为您的实体提供的广泛解决方案,您可以选择以下几种:

多个转换器

创建一个处理大多数逻辑的抽象类型转换器,以使您拥有真正轻量级的每个实体的子类.在xwork-conversion.properties中注册每个转换器.

接口驱动转换器

我使用的方法是有一个名为IdBasedJpaEntity的接口,该接口实现了99.9%的实体.它定义了Integer类型的getId()方法.然后,我有一个JpaDAORegistry单例类,该类是在应用程序启动时创建的.我向它注册了我的每个实体,并且它构造了每个DAO的单个实例(基本上是事实上的单例).我有一个实体类到DAO实例的映射.这使我的类型转换器可以为任何给定的IdBasedJpaEntity查找合适的DAO实例,从而使我可以使用一个JpaEntityConverter类,该类可以与实现该接口的任何实体一起使用.这条路线还有很多工作要做,但是对我来说已被证明是高度可重用的.

上一篇:java-Struts2静态数据存储/访问


下一篇:java-在struts中,如何获取布尔值的null?