Java 是否有任何可用的API来表示项目的各种单位,如千克、升、米、公里等

Java 是否有任何可用的API来表示项目的各种单位,如千克、升、米、公里等,java,jpa,units-of-measurement,jscience,Java,Jpa,Units Of Measurement,Jscience,在我的项目中,我必须在某个地方处理一个由项组成的unitOfIssue。现在,各种项目当然可以有不同的表示单位。所以,我在寻找某种API或某种方式,来优雅地处理这种情况 是否有任何可用的API提供了一些表示这些单元的方法?我听说这似乎令人印象深刻,但在JPA中映射它时,我又面临另一个问题。在谷歌做了一些工作之后,我发现一些工作正在这个背景下进行,比如-,但它似乎还不稳定,无法用于生产 我也发现了一些,但从它看来似乎已经被拒绝 然后我遇到了,我还没有深入了解细节。但是,同样的问题再次出现。这可以映

在我的项目中,我必须在某个地方处理一个由
项组成的
unitOfIssue
。现在,各种项目当然可以有不同的表示单位。所以,我在寻找某种API或某种方式,来优雅地处理这种情况

是否有任何可用的API提供了一些表示这些单元的方法?我听说这似乎令人印象深刻,但在
JPA
中映射它时,我又面临另一个问题。在谷歌做了一些工作之后,我发现一些工作正在这个背景下进行,比如-,但它似乎还不稳定,无法用于生产

我也发现了一些,但从它看来似乎已经被拒绝

然后我遇到了,我还没有深入了解细节。但是,同样的问题再次出现。这可以映射到JPA吗

编辑:-我遇到过,但我不知道它是否已准备好生产

我真的很困惑,尤其是在看到上面这些选项之后。对于我是否可以使用其中任何一种,JPA是一个额外的关注点。有没有人曾经面对过这样的情况,并找到了一条出路?我真的需要一些帮助。我应该用什么?
若并没有其他出路,那个么什么才是代表这些单位的合适方式呢。我看到的一种方法是使用
enums
。但是,当然,那将是最后的选择。

我建议你自己写。您可能还需要
度量单位转换

从中定义计量单位

和转换


我参与了一个广泛使用JSR-275的项目(在被JCP拒绝之前)。最初我们没有使用JPA,但后来决定我们应该使用JPA2.0持久化我们的模型,我必须处理度量对象的持久化

这可能不是你问题的答案,但可能会给讨论带来一些有趣的想法

我们考虑了几个备选方案:

  • 度量是可序列化的,JPA可以映射任何可序列化的对象。这里的问题是度量值将作为二进制对象保存在数据库中,并且它们将受到所有序列化问题的约束(即版本控制等)
  • 我们可以通过将数据保留为原始类型(即整数、双精度等)来调整我们的模型,前提是我们同意对每个单位使用国际度量单位。因此,字段将基于JPA支持的类型,但getter和setter将使用度量对象。将JPA映射配置为基于字段而不是属性。这里的问题是必须更改模型以更改封装的数据,而不影响域对象的公共接口
  • 因为我们使用hibernate作为持久性提供者,所以我们可以接受与JPA标准不同的做法,并使用它将度量对象映射到相应的原语类型。然后我们可以使用hibernate注释来映射我们的类型。(). 其中的警告是,持久性供应商将失去独立性
    我们最终使用了备选方案3,效果非常好。

    @msandiford。。是的,我知道。在我的问题中,我也引用了这一点。但是,它不能与JPA一起使用。有问题吗(好吧,写我自己的将是我最后的选择。但是如果我能得到一些预构建的API,那将节省我很多时间。让我们看看是否有人能想出一些神奇的方法。)当然。我不知道如何在JPA中与第三方api进行映射,或者你需要使用某种基本类型代码,而不是使用UOM实体。我也想到了你的第三种选择。现在,因为我们现在没有任何
    度量对象,所以不能考虑它。但是,在JPA中,可以使用
    EclipseLink@Converter
    注释来完成转换部分。几天前,我将joda time
    DateTime
    映射到MySQL时间戳,结果非常好。我将通过创建自己的自定义类来研究这些转换。但这需要时间。@RohitJain这是真的。开发一个适用于所有装置的好转换器需要一些时间,但一旦开发完成,其余的都是小菜一碟。需要注意的是,一旦您这样做了,您就依赖于JPA实现;从那时起,您就依赖于持久性提供者。不是每个人都有这样的奢侈:——)@Edwin。。你说得对。对特定PersistenceProvider的依赖性在这里是一个值得关注的问题。但是,如果我必须自己去做的话,那就太疯狂了(注:类型转换器在JPA2.1中是(将)标准化的,因此,一旦您编写了这样一个东西(符合标准),它就可以与任何JPA(2.1)提供商一起工作