morphia BigDecimal持久性问题

时间:2017-10-31 07:47:42

标签: java mongodb morphia

我使用morphia来持久保存其中一个字段为BigDecimal的对象。

@Entity
class MyObject {
    BigDecimal myField;
}

我尝试将其保存到db:

    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

3 个答案:

答案 0 :(得分:1)

正如您所提到的,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);
    }
} 

答案 1 :(得分:0)

另请注意,有些人在使用BigDecimal和旧版本的java驱动程序时遇到了问题。 (见this issue)。确保你有mongo-java-driver版本3.5.0或更新。

答案 2 :(得分:0)

据我所知,Morphia并不完全支持大十进制,但是这种依赖性将大十进制转换为它支持的数据类型。

https://mvnrepository.com/artifact/dev.morphia.morphia/core/1.5.8