3

我们正在开发一个分布式的、顺序的 ID 生成器,它可以创建一个 96 位的数字 ID。我们在应用程序中为这个值工作的数据类型是decimal. 在数据库方面,列的数据类型将是decimal(28,0).

问题是当我通过代码映射并配置Id时,我无法指定精度和比例。理想情况下,我想要这样的东西:

map.Id(c => c.Id, id =>
         {
             id.Generator(RustFlakeGeneratorDef.Instance);
             id.Precision(28); // nope
             id.Scale(0); // nope. *$%!
         });

如果我尝试忽略它,NHibernate 会decimal(28,5)在创建参数和发出命令时回退到使用,这将不起作用。

我知道有一张,如果我想在适当的时候做出贡献。与此同时,我需要看看这是否会成功,所以我想知道是否有任何解决方法。自定义类型,破解反序列化的 HBM,诸如此类?

我确实尝试创建自己的派生自 的类型DecimalType,并且我覆盖了返回 的属性,SqlType我在其中指定了自己的精度和比例,但这似乎没有任何作用。

4

1 回答 1

0

所以我想我可以编辑 ByCode 创建的反序列化 HBM 映射并手动更新映射。

var mapping = ModelMapper.CompileMappingFor(entityTypes);

// HACK: by code mapping doesn't support setting precision and scale, so fix flake ID columns here
var flakeTypeName = typeof (RustFlakeGenerator).AssemblyQualifiedName;

foreach (var id in (from root in mapping.RootClasses
                    where root.Id.Type.name == "Decimal" && root.Id.generator.@class == flakeTypeName
                    select root.Id))
{
    var column = id.column == null || !id.column.Any() ? new HbmColumn() : id.column.First();
    column.name = id.name;
    column.precision = "28";
    column.scale = "0";

    if (id.column == null || !id.column.Any()) id.column = new[] {column};
}

这很糟糕,SchemaExport 等人完全忽略了精度和比例(默认为decimal(19,5),但我只将它用于脚手架,并且可以手动修复它),但它可以工作。

于 2013-03-08T11:49:59.750 回答