如何添加自己的EnumValueMapperSupport

时间:2015-11-28 06:57:52

标签: java hibernate enums

我正在尝试在Hibernate中保留一些enum,看起来我的内置支持的两个选项是使用枚举的名称,我宁愿不做,因为它是基于字符串而不是基于int,或enum的序数,我宁愿不这样做,因为如果我稍后在类的顶部添加一个枚举值,我会把所有内容都打破。

相反,我有一个名为Identifiable的界面,其public int getId()作为合同的一部分。这样,我想要保留的枚举可以实现Identifable,我可以知道他们将定义自己的id。

但是当我尝试扩展EnumValueMapperSupport以便我可以利用这个功能时,我遇到了来自编译器的错误,因为EnumValueMapper接口和EnumValueMapperSupport类不是静态的,因此应该被锁定到给定的EnumType对象中

如何在Hibernate中扩展此功能,而不是重写一堆Hibernate代码并提交补丁。如果我不能,是否有其他方式以某种方式存储基于序数或名称之外的其他内容的枚举,而是基于您自己的代码?

在一个相关的想法中,有没有人亲自走这条路,并决定“让我们看看名称映射有多糟糕”,然后选择名称映射,因为它的表现并没有那么糟糕?比如,我有可能在这里过早优化吗?

我正在反对Hibernate 5.0.2-final版本。

1 个答案:

答案 0 :(得分:0)

至少对于Hibernate 4.3.5,EnumValueMapper 静态的 - 虽然是私有的。

但您可以将EnumValueMapperSupport扩展为EnumType

public class ExampleEnumType extends EnumType {

    public class ExampleMapper extends EnumValueMapperSupport {
      ...
    }

}

要创建此映射器的实例,您需要EnumType的实例:

ExampleEnumType type = new ExampleEnumType();
ExampleMapper mapper = type.new ExampleMapper();

或者您在类型中创建它:

public class ExampleEnumType extends EnumType {

    public class ExampleMapper extends EnumValueMapperSupport {
        ...
    }

    public ExampleMapper createMapper() {
        return new ExampleMapper();
    }
}