gpt4 book ai didi

java - 吗啡 BigDecimal 持久性问题

转载 作者:行者123 更新时间:2023-11-30 06:26:49 26 4
gpt4 key购买 nike

我正在使用吗啡来持久化其字段之一为 BigDecimal 的对象。

@Entity
class MyObject {
BigDecimal myField;
}

我尝试将其保存到数据库:

    Morphia morphia = new Morphia();
Datastore datastore = morphia.createDatastore(new MongoClient("localhost"), "myStore");
morphia.getMapper().getConverters().addConverter(new BigDecimalConverter());
MyObject foo = new MyObject ();
foo.setMyField(new BigDecimal("1.1111111111111111"));
datastore.save(foo);

但我得到以下异常:

    Caused by: java.lang.RuntimeException: java.lang.NumberFormatException: Conversion to Decimal128 would require inexact rounding of 1.111111111111111160454356650006957352161407470703125
at org.mongodb.morphia.mapping.ValueMapper.toDBObject(ValueMapper.java:29)
at org.mongodb.morphia.mapping.Mapper.writeMappedField(Mapper.java:867)
at org.mongodb.morphia.mapping.Mapper.toDBObject(Mapper.java:982)
... 7 more

最佳答案

正如您所提到的,Morphia 包确实有自己的 BigDecimalConverter,您可以将其注册到该对象。但如果您需要其他自定义行为,您可以创建自己的转换器。例如,当我需要更改 BigDecimalConverter 的编码实现时,我使用覆盖此方法的类来扩展此类。查看以下实现。

public class CustomBigDecimalConverter extends 
org.mongodb.morphia.converters.BigDecimalConverter {

public CustomBigDecimalConverter() {
super();
}

@Override
public Object encode(final Object value, final MappedField optionalExtraInfo) {
if (value instanceof BigDecimal) {
return ((BigDecimal) value).setScale(10, RoundingMode.CEILING);
}
return super.encode(value, optionalExtraInfo);
}
}

关于java - 吗啡 BigDecimal 持久性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47030246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com