【问题标题】:MappingException: Could not interpret id generator strategy with custom id generatorMappingException:无法使用自定义 id 生成器解释 id 生成器策略
【发布时间】:2014-02-14 08:10:00
【问题描述】:

我需要一个自定义 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

希望有一个向导可以为我提供一些有用的想法。谢谢。

【问题讨论】:

    标签: hibernate jpa dropwizard


    【解决方案1】:

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

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

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

    【讨论】:

    • 哇。很棒的收获!过度依赖 IDE 的风险是,我显然已经失去了校对自己代码的能力。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多