我需要一个自定义id生成器,保存最后使用的id,而不是下一个可用的,所以基于这个答案https://stackoverflow.com/a/10648572/187423我创建了一个自定义生成器扩展TableGenerator。
我已经在调试模式下确定我的自定义生成器没有被添加到org.hibernate.id.factory.internal.DefaultIdfierGeneratorFactory.generatorStratfia ToClassNameMap,所以它不知道如何解释我的生成器。(似乎我应该使用句柄而不是类名,但同样-不确定如何将其放入映射中。)
我还使用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
希望有个巫师能为我提供一些有用的想法。谢谢。
ProntoPersistJustUsedGenerator位于com.pronto.util。hibernate包,但com.pronto。util包用于GenericGenerator注释。
当使用完整包名称作为策略属性的值时,问题消失了:
strategy = "com.pronto.util.hibernate.ProntoPersistJustUsedGenerator"
我遇到了Hibernate映射问题:无法解释ID生成器策略:堆栈跟踪: 我的Custome ID生成器类如下所示: 我在谷歌上搜索过,但找不到解决方案。请让我知道,如果我做了任何错误或有解决办法。谢谢
我使用的是SpringBoot(1.4)、SpringData和jpa。使用我的表/实体之一的ID列(crudepository),我想生成自定义字符串。从一些特定的字符串加上创建数据和时间开始,以db中的下一个值结束。所以这里我不能使用,我需要一些本地查询,比如“selectnextvalue” 有没有更好的方法可以做到这一点。
问题内容: 任何人都知道一些有关如何为hibernate创建自定义ID生成器的好教程吗? 问题答案: 在Google上粗略搜索“hibernate自定义ID生成器教程”,发现了以下可能性。我排除了那些看起来没有用的内容,并总结了它们的内容。 http://www.devx.com/Java/Article/30396-涵盖了在数据保留之前生成ID(因此还没有业务密钥)的问题。 http://doc
环境:Spring Boot 2.2.6 启动程序:spring-boot-starter-data-jpa,*-thymeleaf,*-web,*-Tomcat,*-test 其他依赖项:mariadb-java-client 2.6.0,spring-boot-devtools(管理),lombok(管理) DB mariadb:10.4 Hibernate方言:mariadb103 使用内部
问题内容: 有人知道如何从1开始生成,以便下一个对象具有2,依此类推吗? 我尝试了以下方法,但不起作用: 问题答案: 您需要一个 静态的 类成员来跟踪上次使用的索引。确保还实现一个复制构造函数: 更新: 正如@JordanWhite建议的那样,您可能希望使static计数器成为 atomic ,这意味着可以安全地同时使用(即一次在多个线程中使用)。为此,将类型更改为: 增量读取和复位操作变为:
我在jOOQ 3.13.1,dropwizard 2.0.7。为了将jOOQ和dropwizard放在一起,我使用(https://droptools.bendb.com/jooq/)。我使用自定义生成策略来为我的setter和getter维护骆驼大小写。名称按预期进入。 记录对象具有各自列的数据。然而,我不断从数据库中获取错误,我试图在非空列上设置“null”。 我只有在尝试创建新记录时才看到这