JodaTime有一个提供Hibernate持久性的库.最近我开始关注Joda-Money并开始看看如何使用hibernate持久保存,我没有看到任何库.
有什么建议?
我正在尝试使用Jadira类型的JODA钱类来处理到Hibernate 4的映射.
它工作正常(除了我有太多的货币字段).
但我需要构建一个聚合查询来总结一些总数.
这是类型声明.
@Columns(columns = { @Column(name = "total_currency", length=10), @Column(name = "total") })
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency")
private Money total;
Run Code Online (Sandbox Code Playgroud)
我正在尝试定义一个查询,例如:
@Query(value="select sum(oi.total) from OrderItem oi where oi.order = ?1")
Double calculateSubtotal(Order order);
Run Code Online (Sandbox Code Playgroud)
有没有办法使用JPQL聚合Money字段的查询?
谢谢.
我正在开发一个严重依赖Joda-Money的应用程序,并且有许多单元测试来验证我的业务逻辑.对我来说,一个(不可否认的是次要的)关键点是用什么样的Money
/ BigMoney
对象进行测试; 具体来说,CurrencyUnit
使用什么.
在我看来,我有几个选择:
只是用 USD
这显然是最简单的方法,我的大多数实际应用都将使用美元,因此它有一定的意义.另一方面,它感觉相当以美国为中心,我担心它会冒险让特定货币的错误不受控制.
使用另一种真实货币,比如 CAD
这会捕获错误的硬编码USD
,但除此之外并没有比使用更好USD
.
使用专用的"假"货币,即XTS
毕竟,这显然XTS
是"保留用于测试".但Joda将伪货币表示为带-1
小数位的货币.实际上,Joda-Money中货币之间的主要区别是小数位数,因此这可能会掩盖涉及小数位精度的任何错误,例如错误地舍入为整数值.
注册我自己的自定义货币 CurrencyUnit.registerCurrency()
这显然有效,但看起来有点奇怪,因为有其他选择.
使用CurrencyUnit
由模拟库创建的实例
与注册自定义货币几乎相同.
再次,这显然是一个小问题,但我很好奇是否有这样的案例的标准做法,或者是否有明确的理由特别喜欢这些选项之一.
试试这个:
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency")
private org.joda.money.Money price;
Run Code Online (Sandbox Code Playgroud)
得到这个:
org.hibernate.MappingException: property mapping has wrong number of columns:domain.ClientOrderItem.price type: org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmountAndCurrency
Run Code Online (Sandbox Code Playgroud)
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyAmount",
parameters = {@org.hibernate.annotations.Parameter(name = "currencyCode", value = "USD")})
Run Code Online (Sandbox Code Playgroud)
效果很好,但我想将货币存储在数据库中并能够使用不同的货币。
尝试从 MySQL 数据库读取的 BigDecimal 创建 Joda-MoneyMoney
对象会引发错误。
这段代码:
PreparedStatement p_stmt = ...;
ResultSet results = ...;
Money amount = Money.of(CurrencyUnit.USD, results.getBigDecimal("amount"));
Run Code Online (Sandbox Code Playgroud)
抛出这个:
java.lang.ArithmeticException: Scale of amount 1.0000 is greater than the scale of the currency USD
at org.joda.money.Money.of(Money.java:74)
at core.DB.getMoney(DB.java:4821)
Run Code Online (Sandbox Code Playgroud)
我实际上已经通过添加舍入解决了该错误:
Money amount = Money.of(CurrencyUnit.USD, results.getBigDecimal("amount"), RoundingMode.HALF_UP);
Run Code Online (Sandbox Code Playgroud)
但是,我对这个解决方案持怀疑态度。是最好的吗?
我用来按照这个 SO 答案DECIMAL(19,4)
将货币值存储在数据库上。老实说,这有点让我困惑,为什么那里的回答者要求数据库上的小数点后 4 位精度,但我倾向于相信高价值的答案,并且我认为他们知道他们在说什么,并且我会后悔没有遵循他们的要求建议。然而 Joda-Money 不喜欢美国货币的小数点后 4 位精度。也许是国际标准要求小数点后 4 位精度?没有把握..DECIMAL(19,4)
为了使问题简洁:
RoundingMode.HALF_UP
解决此错误的理想解决方案吗?DECIMAL(19,4)
吗DECIMAL(19,2)
?我有一个具有数据类型joda.money属性的类。如何将这个属性映射到mysql中。
我的课是:
@Table(name =“ products”)公共类Product(){@Column(name =“ name”)字符串名称;@Column(name =“ money”)金钱金钱;}
我正在使用Spring Hibernate
谁能说出如何将此模型存储到mysql中?
我有以下字符串
String money = "USD0.00"
Run Code Online (Sandbox Code Playgroud)
想把这个转换成 org.joda.money.Money
我是否需要在此处拆分货币单位和双倍值,并需要在 Money. 或者有任何库 api 可以转换它吗?
joda-money ×7
java ×6
hibernate ×4
java-8 ×1
jdbc ×1
jpa ×1
mysql ×1
spring-data ×1
unit-testing ×1