0

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

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

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

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

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

这些方法与 using 相比如何UserType?还有其他优点UserType吗?

4

2 回答 2

2

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

Hibernate中的Imo用户类型展示了一些很好的例子来解决技术转换问题,比如 int-to-Date 等等,这些都很好地放置在UserType.

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

UserType上述示例的可能缺点:

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

可能的优势:

  • 您可以轻松地在查询级别运行比较,例如查找最高/最低金额的记录。
于 2012-08-21T08:00:47.997 回答
1

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

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

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

于 2012-08-21T08:07:58.583 回答