Hibernate:UserType与字段/属性访问

时间:2012-08-21 04:34:00

标签: java hibernate

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

以上示例中UserType的可能缺点:

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

可能的优势:

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

答案 1 :(得分:1)

书籍例子通常很差。并不是说这本书本身就很差。例如,我认为Java Persistence with Hibernate是最好的Hibernate书籍。但这些例子必须简明扼要,因此,离现实世界有点远。

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

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