Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate无法正确识别序列增量_Java_Oracle_Hibernate - Fatal编程技术网

Java Hibernate无法正确识别序列增量

Java Hibernate无法正确识别序列增量,java,oracle,hibernate,Java,Oracle,Hibernate,我们使用SpringBoot2.2.1和Hibernate5.4.8.Final,dialen org.Hibernate.dialen.Oracle12cDialect,对带有开放JDK11的Oracle 19.3.0.0数据库进行测试 Hibernate随机且仅对某些开发人员而言无法初始化,出现以下异常: org.hibernate.MappingException: The increment size of the [SEQ_THE_SEQUENCE] sequence is set t

我们使用SpringBoot2.2.1和Hibernate5.4.8.Final,dialen org.Hibernate.dialen.Oracle12cDialect,对带有开放JDK11的Oracle 19.3.0.0数据库进行测试

Hibernate随机且仅对某些开发人员而言无法初始化,出现以下异常:

org.hibernate.MappingException: The increment size of the [SEQ_THE_SEQUENCE] sequence is set to [10] in the entity mapping while the associated database sequence increment size is [1].
    at org.hibernate.id.enhanced.SequenceStyleGenerator.configure(SequenceStyleGenerator.java:257)
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:118)
    ... 42 common frames omitted
Wrapped by: org.hibernate.MappingException: Could not instantiate id generator [entity-name=com.[...].TheEntity]
    at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.createIdentifierGenerator(DefaultIdentifierGeneratorFactory.java:124)
    at org.hibernate.mapping.SimpleValue.createIdentifierGenerator(SimpleValue.java:344)
    at org.hibernate.internal.SessionFactoryImpl.lambda$new$1(SessionFactoryImpl.java:292)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
    at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1675)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:291)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1249)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391)
    ... 25 common frames omitted
Wrapped by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator [entity-name=com.[...].TheEntity]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:403)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1862)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1799)
    ... 21 common frames omitted
Wrapped by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator [entity-name=com.[....]TheEntity]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1803)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
    at ....main(....java:28)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)

具有抽象父级的实体:

@MappedSuperclass
公共抽象类AbstractParentEntity实现了JpaBaseEntity{
公共静态最终字符串SEQ_GENERATOR_NAME=“SEQ_GENERAL”;
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,生成器=序列生成器名称)
@列(name=“[ID]”,unique=true,nullable=false,insertable=false,updateable=false)
保护长id;
...
}
@实体
@表(name=“[THE_ENTITY]”)
@SequenceGenerator(name=AbstractParentEntity.SEQ_GENERATOR_name,sequenceName=“SEQ_THE_SEQUENCE”,allocationSize=10)
公共类实体扩展了抽象父实体{
...
}
我们的应用程序使用池序列生成器,而不是在spring配置中配置的hilo:

spring.jpa.properties.hibernate.id.new\u生成器\u映射:true

我知道,但我不认为它适合我们的情况,因为它明确地只影响hilo

我已经在数据库中对序列进行了两次和三次检查,但它表示“增量为10”,并且与所有其他环境中的情况相同。我已经清理并重建了应用程序。我已经多次删除并重新创建了数据库,并重新启动了Oracle数据库,因为我没有东西可以尝试了。我还能做些什么来解决这个问题

编辑1:

在调试到
SequenceStyleGenerator
之后,我可以解释这种行为

此Hibernate类中的方法
getSequenceIncrementValue
尝试从数据库中读取增量值:

private Long getSequenceIncrementValue(JdbcEnvironment JdbcEnvironment,String sequenceName){
返回jdbcEnvironment.getExtractedDatabaseMetaData().getSequenceInformationList()
.stream()
.过滤器(
序列信息->{
标识符catalog=sequenceInformation.getSequenceName().getCatalogName();
标识符schema=sequenceInformation.getSequenceName().getSchemaName();
返回sequenceName.equalsIgnoreCase(sequenceInformation.getSequenceName().getSequenceName().getText())&&
(catalog==null | | catalog.equals(jdbcEnvironment.getCurrentCatalog())&&
(schema==null | | schema.equals(jdbcEnvironment.getCurrentSchema());
}
)
.map(SequenceInformation::getIncrementValue)
.filter(对象::非空)
.findFirst()
.orElse(空);
}
…getSequenceInformationList()
的结果包含两个条目,其名称为
SEQ\u SEQUENCE
。一个来自应用程序模式,另一个来自数据库中的模式。序列也存在于此,且增量为1。由于从
sequenceInformation
对象派生的变量
catalog
schema
对于这两个条目都为空,Hibernate处理第一个变量,即错误架构中的变量


现在的问题是,为什么缺少此元数据。

如果与Hibernate一起使用的DB用户可以访问数据库中的多个架构,它将检索有关所有序列的信息,因为使用了查询
select*from all_sequences
。如果具有相同名称的序列存在于不同的模式中,那么第一个序列将碰巧与Hibernate定义进行比较

不幸的是,在Oracle上似乎无法获取属于序列的模式,如
SequenceInformationExtractorRacledatabaseImpl
中的实现所示:

@覆盖
受保护的字符串序列SchemaColumn(){
返回null;
}
这只发生在本地环境(也称为“我的机器”)上,因为我们有一个可以访问多个模式的用户。这只发生在一些开发人员身上,因为集成测试数据库模式有时处于不同应用程序版本的状态,然后发生了不匹配


我们需要对用户进行更多限制。

您使用的是什么hibernate方言?org.hibernate.dial.Oracle12cDialect,已将其添加到帖子中。您可以从
Oracle12cDialect
覆盖GetQuerySequenceString()方法来纠正此行为。看,这是个好建议,谢谢!