我需要一个自定义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
希望有一个向导有一些有用的想法给我。感谢。
答案 0 :(得分:7)
ProntoPersistJustUsedGenerator位于com.pronto.util.hibernate
个包中,com.pronto.util
包用于GenericGenerator
注释。
使用完整包名称作为策略属性的值时,问题就消失了:
strategy = "com.pronto.util.hibernate.ProntoPersistJustUsedGenerator"