有没有可用的API来表示各种物品的单位,比如千克、升、米、千米等?

14
在我的项目中,我需要处理ItemsunitOfIssue。不同的物品当然可以有不同的表示单位。所以,我正在寻找一些API或某种方法来优雅地处理这种情况。
是否有任何可用的API提供了一些方式来表示这些单位?我听说过JScience,它似乎很不错,但我现在又面临着使用JPA映射的另一个问题。经过一些谷歌搜索,我发现在这个上下文中有一些工作正在进行 - JScience-JPA,但它似乎还不够稳定,不能用于生产。
我还发现了关于JSR-275的一些内容,但从这个JCP页面上看,它似乎已被拒绝。
然后我发现了unitsofmeasure,但我还没有深入研究细节。但是,同样的问题又出现了。这可以与JPA映射吗? 编辑:这个SO问题中,我发现了Java Numbers with Unit,但我不知道它是否已经准备好投入生产。
我真的很困惑,特别是在看到上面那些选项之后。而JPA也是一个额外的问题,我是否可以使用其中任何一个。有没有人曾经遇到过这种情况,并找到了解决方法?我真的需要一些帮助。我应该使用什么?如果没有其他出路,那么代表这些单位的适当方式是什么?我认为其中一种方法是使用enums。但是,当然,那将是最后的选择。


@msandiford.. 是的,我知道。我在我的问题中也引用了那个链接。但是,它不能与JPA一起使用。存在问题。 :( - Rohit Jain
2个回答

4
我曾参与一个项目,其中我们广泛使用了JSR-275(在被JCP拒绝之前)。最初,我们没有使用JPA,但后来决定使用JPA 2.0持久化我们的模型,并且我需要处理我的度量对象的持久化。这可能不是你问题的答案,但可能会为讨论带来一些有趣的想法。我们考虑了几种替代方案:
  1. 度量值是可序列化的,而JPA可以映射任何可序列化的对象。问题在于,度量值将被保存为二进制对象在数据库中,并且它们将受到所有序列化问题的影响(即版本控制等)。
  2. 我们可以通过使用国际计量单位来适应我们的模型,保留原始类型数据(即整数、双精度等),因此,字段将基于JPA支持的类型,但getter和setter将使用度量对象。配置JPA映射基于字段而不是属性。这里的问题是需要改变模型以更改封装的数据,而不影响域对象的公共接口。
  3. 由于我们使用Hibernate作为持久化提供程序,我们可以接受偏离JPA标准并使用Hibernate自定义值类型将度量对象映射到相应的基本类型。然后,我们可以使用Hibernate注释来映射我们的类型(请参见此处示例)。这种方法的缺点是失去了持久性供应商的独立性。
我们最终选择了第三种替代方案,效果还不错。

你的第三个选择也是我想到的。现在,由于我们没有任何“Measure”对象,所以它不能被考虑。但是,只是引用一下,在JPA中,可以使用“EclipseLink @Converter”注释来完成转换部分。几天前,我为映射joda time DateTime到MySQL TimeStamp做了这件事,并且效果非常好。我将通过创建自己的自定义类来研究这些转换。但这需要时间。 - Rohit Jain
@RohitJain 这是真的。开发一个适用于所有单位的好转换器需要一些时间,但一旦完成,其余的就易如反掌了。但问题在于,一旦你这样做了,你就依赖于那个 JPA 实现;从那时起,你就依赖于你的持久性提供者。并不是每个人都有这种奢侈 :-) - Edwin Dalorzo
1
@Edwin.. 你说得对。依赖于特定的PersistenceProvider是一个问题。但是,如果我必须自己做这件事,那将会非常疯狂。:( - Rohit Jain
1
注意类型转换器将在JPA2.1中标准化,因此一旦您编写了符合标准的类型转换器,它就可以与任何JPA(2.1)提供程序一起使用。 - DataNucleus

1

好的,编写自己的API将是我的最后选择。但如果我能得到一些预先构建的API,那将节省我很多时间。让我们看看是否有人能想出一些魔法。 :) - Rohit Jain
当然。我不确定如何在JPA中与第三方API进行映射,否则您需要使用某种原始类型代码,而不是使用UOM实体。 - vels4j

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接