Struts2 xwork类型转换与休眠

时间:2011-01-25 01:29:19

标签: java hibernate struts2 type-conversion crud

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

现在我想在我的应用程序中为某个hibernate实体创建一个CRUD。我想要更改与Account相关联的User。我可以使用特定值传递参数user.account.id,前提是我拥有​​所有正确的getter / setter。

这在第一次创建对象时完全正常,其中帐户将为null。这使得ognl创建了一个新的帐户对象,并将id设置为传入的内容。

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

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

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

1 个答案:

答案 0 :(得分:3)

类型转换器的持久性

为实体创建一个类型转换器,然后只传递user.account,而不是user.account.id。这将调用getUser().setAccount(account)并且不会让您头疼。

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

对于您的实体的广泛解决方案,您有几个选择:

多个转换器

创建一个处理大多数逻辑的抽象类型转换器,以便您拥有一个非常轻量级的每个实体的子类。在xwork-conversion.properties

中注册每个转换器

接口驱动转换器

我使用的方法是我有一个名为IdBasedJpaEntity的接口,其中99.9%的实体实现。它定义了getId()类型为Integer的方法。然后,我有一个JpaDAORegistry单例类,我在我的应用程序启动时创建。我用它注册我的每个实体,它构造每个DAO的一个实例(基本上,一个事实上的单例)。我有一个实体类到DAO实例的映射。这允许我的类型转换器为任何给定的IdBasedJpaEntity查找适当的DAO实例,允许我有一个JpaEntityConverter类,它可以与任何实现该接口的实体一起使用。这条路线预先做了一些工作,但事实证明我可以重复使用。