在Struts2应用程序中转换类型的最佳方法是什么?
现在,我想在我的应用程序中为某个hibernate实体创建一个CRUD。假设我想要更改与User关联的Account。只要我拥有所有合适的getter/setter,我就可以用一个特定值传入参数user.account.id。
当第一次创建一个对象时,当帐户为空时,这种方法工作得非常好。这会让ognl创建一个新的account对象,并将id设置为传入的内容。
当尝试更改封装的Account对象时,会出现此问题。使用相同的user.account.id参数,ognl将其解释为getUser().getAccount().setId(param)。Hibernate将此解释为试图更改主键。
我理解它为什么这样做,我只是想知道是否有更好的方法来处理这种情况。这在我们的应用程序中很常见,在通过hibernate保存它们之前,我不想一直创建多个对象并封送它们。
在struts2中没有更好的方法来解决这个问题吗?
发布于 2011-01-25 12:33:05
持久化类型转换器
为实体创建一个类型转换器,然后只传递user.account,而不是user.account.id。这将调用getUser().setAccount(account),并且不会给您带来麻烦。
当您更新记录时,只需在表单中将user.account作为隐藏字段传递即可。
对于你的实体的广泛解决方案,你有几个选择:
多个转换器
创建一个处理大部分逻辑的抽象类型转换器,这样您就拥有了真正轻量级的每个实体的子类。在xwork-conversion.properties中注册每个转换器。
接口驱动转换器
我使用的方法是,我有一个名为IdBasedJpaEntity的接口,99.9%的实体都实现了它。它定义了Integer类型的getId()方法。然后,我有了一个JpaDAORegistry单例类,它是我在应用程序启动时创建的。我向它注册了我的每个实体,它构造了每个DAO的单个实例(基本上就是一个实际的单例)。我有一个实体类到DAO实例的映射。这允许我的类型转换器为任何给定的IdBasedJpaEntity查找适当的DAO实例,从而允许我有一个单独的JpaEntityConverter类来处理实现该接口的任何实体。这条路线需要更多的前期工作,但对我来说已经被证明是高度可重用的。
https://stackoverflow.com/questions/4789123
复制相似问题