【问题标题】:Struts2 xwork Type Conversion with hibernateStruts2 xwork 与休眠的类型转换
【发布时间】:2011-06-14 22:02:15
【问题描述】:

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

现在我想在我的应用程序中为某个休眠实体创建一个 CRUD。假设我想更改与User 关联的Account。只要我拥有所有正确的 getter/setter,我就可以传入具有特定值的参数 user.account.id

这在第一次创建对象时非常有效,其中帐户将为空。这使得 ognl 创建一个新的帐户对象,并将 id 设置为传入的内容。

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

我明白为什么会这样,我只是想知道是否有更好的方法来处理这种情况。这在我们的应用程序中很常见,我不想在通过休眠保存它们之前一直创建多个对象并对其进行封送处理。

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

【问题讨论】:

    标签: java hibernate struts2 type-conversion crud


    【解决方案1】:

    持久性类型转换器

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

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

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

    多个转换器

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

    接口驱动转换器

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

    【讨论】:

    • 我喜欢你的方法,但我做了一些修改。我为转换器提供了对 EntityManager 的引用。因为em 有一个find 方法,它接受一个类对象(无论如何都是在转换方法中传递的)和一个主键。目前这对我有用,而且看起来相当简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2016-08-05
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多