在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中没有更好的方法来解决这个问题?
答案 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
类,它可以与任何实现该接口的实体一起使用。这条路线预先做了一些工作,但事实证明我可以重复使用。