【问题标题】:Hibernate: UserType vs field/property accessHibernate:用户类型与字段/属性访问
【发布时间】:2012-08-21 04:33:59
【问题描述】:

Java Persistence with Hibernate 一书中,它讨论了使用UserType 的以下用例:

我们需要在数据库中存储货币金额,但用户可以使用任何货币。因此,我们在将金额存储到数据库之前将其“标准化”为美元,并使用UserType 实现,该实现将在存储之前将金额转换为美元,并在从数据库中读取它之后将其转换为用户指定的货币,然后将其返回给用户。

我可以想到另外两种方法来做到这一点:

1) 使用 Hibernate 的字段访问来存储/读取 DB,并使用公共 getter/setter 进行转换,

2) 为 Hibernate 创建一对将使用 USD 的私有 getter/setter,以及为用户进行必要转换的公共 getter/setter。

这些方法与使用UserType 相比如何? UserType还有其他优势吗?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    作为一般的经验法则,我会说UserType 适用于相当技术性的问题,而模型中的代码应该专注于领域问题。

    Imo User Types in Hibernate 展示了一些很好的技术转换问题示例,例如 int-to-Date 等,它们很好地放置在 UserType 中。

    关于您给出的货币示例,我想说这在很大程度上取决于具体情况,如果 UserType 是合适的。货币转换问题可能会变得非常复杂,我宁愿认为这些是领域问题,因此将相应的代码放在模型中,而不是将其埋在 UserType 中。

    上例中UserType 的可能缺点:

    • 它忽略了转化率的动态特性。考虑一个银行应用程序:当我的帐户余额为 75 欧元时,我实际上有该金额为欧元,而不是在给定时间点转换为美元的欧元金额。当欧元兑美元汇率下降时,我将拥有更少的美元,反之亦然。

    可能的优势:

    • 您可以轻松地在查询级别运行比较,例如查找金额最高/最低的记录。

    【讨论】:

    • 但是即使是技术问题也可以在不使用 UserType 的情况下得到解决(通过我上面提到的方法);还是有一些问题只能通过 UserType 来解决?
    • @shrini1000 考虑到普通的 DB 到类型的转换,我无法想象完全不可能以一种或另一种方式进行转换的情况。认为这真的取决于更广泛的背景,哪个版本更合适并最能满足您的需求。
    【解决方案2】:

    书籍示例通常很差。并不是说这本书本身很差。例如,我认为 Java Persistence with Hibernate 是目前最好的 Hibernate 书籍。但是示例必须简洁且独立,因此与现实世界有些距离。

    如果我没记错的话,这个例子只是为了演示如何使用 UserType,它展示了它的很多特性(特别是“回读”部分)。用例本身并不重要。所以,我会完全抽象他们提出的用例。

    对于这种特殊情况,如果您需要在数据库中存储货币,我建议您查看Joda Money。它们提供了一些现成的 JPA 用户类型,因此您无需担心。是的,您不想在 JPA 实体中保留货币之间的实时转换。我需要一个 EJB 服务来做到这一点。

    【讨论】:

    • +1 对示例的评论和对 Joda Money 的参考。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-05-30
    • 2014-09-18
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2013-03-22
    • 2018-09-10
    • 2014-11-23
    相关资源
    最近更新 更多