MappingException:无法使用自定义id生成器解释id生成器策略

时间:2014-01-23 16:28:44

标签: hibernate jpa dropwizard

我需要一个自定义ID生成器来保存上次使用的id而不是下一个可用的id,因此基于此答案https://stackoverflow.com/a/10648572/187423我创建了一个扩展TableGenerator的自定义生成器。

我已经在调试模式中确定我的自定义生成器没有被添加到org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.generatorStrategyToClassNameMap,因此它不知道如何解释我的生成器。 (似乎我应该使用句柄而不是类名,但是再次 - 不知道如何将其放入地图中。)

我也在使用Dropwizard,这使事情复杂化。我不知道我需要让DW知道我的自定义生成器的方式或位置,但我已经尝试将我的类添加到HibernateBundle,我的DW服务中的run()方法,注入器等等。

这是我在课堂上使用我的生成器的地方:

public class MexpFeedError {
    private int mexpFeedErrorId;

    @Id
    @GeneratedValue(strategy=GenerationType.TABLE, generator = "MEXPFEEDERROR_GEN")
    @GenericGenerator(name = "MEXPFEEDERROR_GEN", strategy = "com.pronto.util.ProntoPersistJustUsedGenerator",
            parameters = {
                    @org.hibernate.annotations.Parameter(name = "table_name", value = "sequence"),
                    @org.hibernate.annotations.Parameter(name = "segment_value", value = "seq_mexpfeederrorid"),
                    @org.hibernate.annotations.Parameter(name = "value_column_name", value = "sequence_value"),
                    @org.hibernate.annotations.Parameter(name = "segment_column_name", value = "sequence_name") })
    public int getMexpFeedErrorId() {
        return mexpFeedErrorId;
    }
    ...
}

这是我的自定义生成器:

package com.pronto.util.hibernate;

import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.enhanced.TableGenerator;

import java.io.Serializable;

@SuppressWarnings("UnusedDeclaration")
public class ProntoPersistJustUsedGenerator extends TableGenerator {

    @Override
    public synchronized Serializable generate(SessionImplementor session, Object obj) {
        return (Long) super.generate(session, obj) + 1;
    }
}

这是堆栈跟踪:

Exception in thread "main" org.hibernate.MappingException: Could not instantiate id generator [entity-name=com.pronto.mpds.entity.MexpFeedError]
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:123)
    at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:195)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:314)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1769)
    at com.yammer.dropwizard.hibernate.SessionFactoryFactory.buildSessionFactory(SessionFactoryFactory.java:77)
    at com.yammer.dropwizard.hibernate.SessionFactoryFactory.build(SessionFactoryFactory.java:35)
    at com.yammer.dropwizard.hibernate.HibernateBundle.run(HibernateBundle.java:38)
    at com.yammer.dropwizard.hibernate.HibernateBundle.run(HibernateBundle.java:13)
    at com.yammer.dropwizard.config.Bootstrap.runWithBundles(Bootstrap.java:77)
    at com.yammer.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:37)
    at com.yammer.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:58)
    at com.yammer.dropwizard.cli.Cli.run(Cli.java:53)
    at com.yammer.dropwizard.Service.run(Service.java:61)
    at com.pronto.mpds.service.DropwizardMPDSService.main(DropwizardMPDSService.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.hibernate.MappingException: Could not interpret id generator strategy [com.pronto.util.ProntoSequenceStyleGenerator]
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.getIdentifierGeneratorClass(DefaultIdentifierGeneratorFactory.java:140)
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:114)
    ... 18 more

希望有一个向导有一些有用的想法给我。感谢。

1 个答案:

答案 0 :(得分:7)

ProntoPersistJustUsedGenerator位于com.pronto.util.hibernate个包中,com.pronto.util包用于GenericGenerator注释。

使用完整包名称作为策略属性的值时,问题就消失了:

 strategy = "com.pronto.util.hibernate.ProntoPersistJustUsedGenerator"