在书Java Persistence with Hibernate
中,它讨论了使用UserType
的以下用例:
我们需要在DB中存储货币金额,但用户可以使用任何货币。因此,我们在将数据存储到数据库之前将其“标准化”为USD,并使用UserType
实现,在存储之前将金额转换为USD,并在从DB读取之后但在返回之前将其转换为用户指定的货币给用户。
我可以想到另外两种方法来做到这一点:
1)使用Hibernate的字段访问来存储/读取数据库,并使用公共getter / setter进行转换,
2)为Hibernate创建一对私有getter / setter,它将使用USD和公共getter / setter为用户进行必要的转换。
这些方法与使用UserType
相比如何? UserType
还有其他优势吗?
答案 0 :(得分:2)
作为一般经验法则,我会说UserType
适用于相当技术方面的问题,而模型中的代码应该关注域关注点。
UserType
中。
关于您给出的货币示例,我会说这很大程度上取决于具体情况UserType
是否合适。货币转换问题可能会变得非常复杂,我宁愿认为这些是域关注点,因此根据代码放在模型中,而不是将其埋在UserType
中。
以上示例中UserType
的可能缺点:
可能的优势:
答案 1 :(得分:1)
书籍例子通常很差。并不是说这本书本身就很差。例如,我认为Java Persistence with Hibernate是最好的Hibernate书籍。但这些例子必须简明扼要,因此,离现实世界有点远。
如果我没记错的话,这个例子只是为了演示如何使用UserType,它显示了很多功能(特别是“回读”部分)。用例本身并不重要。所以,我完全抽象了他们提出的用例。
对于这种特殊情况,如果您需要在数据库中存储货币,我建议您查看Joda Money。它们提供了一些即用型JPA用户类型,因此您无需担心它。是的,在您的JPA实体中,您希望保留货币之间的实时转换。我有一个EJB服务来做到这一点。