PostgreSQL 序列和休眠的问题

problem with postgresql sequence and hibernate

提问人:steprm 提问时间:6/12/2020 最后编辑:steprm 更新时间:4/25/2022 访问量:3053

问:

我经常看这个网站,但这是我第一次写,希望我不会犯错,为我的英语不好道歉。 我直截了当:我必须开发代码以在 postgresql 数据库的单个表上插入记录,在 Springboot 项目上使用 hibernate。该表有一个序列,我想用它来获取 id 的值。 在我的表的hbm.xml文件中,我有这个:

table="td_tito">
        <id name="idTito" column="ID_TITO">
            <generator class="sequence">
                <param name="sequence">seq_td_tito</param>
            </generator>
        </id>
        <property ..../>
        <property ..../>

在 bean 类中,我有变量 idTito 及其 getter 和 setter 方法。

当我尝试通过调用实现 JpaRepository 接口的类的 save 方法来保存时,出现以下异常:

12:56:06.746 [main] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl - On TransactionImpl creation, JpaCompliance#isJpaTransactionComplianceEnabled == false

12:56:06.747 [main] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl - 开始 12:56:06.756 [main] 调试org.hibernate.SQL - 选择 nextval ('hibernate_sequence') 休眠:选择 nextval ('hibernate_sequence') 12:56:06.782 [main] DEBUG org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 无法提取结果集 [n/a] org.postgresql.util.PSQLException:错误:关系“hibernate_sequence”不存在 位置: 17 在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2510) 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2245) 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:311) 在 org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:447) 在 org.postgresql.jdbc.PgStatement.execute(PgStatement.java:368) 在 org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:159) 在 org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:109) 在 org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57) 在 org.hibernate.id.enhanced.SequenceStructure$1.getNextValue(SequenceStructure.java:95) 在 org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40) 在 org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:523) 在 org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:115) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:194) 在 org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId (DefaultSaveEventListener.java:38) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:179) 在 org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 在 org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75) 在 org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102) 在 org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:626) 在 org.hibernate.internal.SessionImpl.save(SessionImpl.java:619) 在 org.hibernate.internal.SessionImpl.save(SessionImpl.java:614) 在 com.xxx.hibernate.TestHIbernate.saveTdtito(TestHIbernate.java:122) 在 com.xxx.hibernate.TestHIbernate.main(TestHIbernate.java:20) 12:56:06.782 [main] WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL 错误:0,SQLState:42P01 12:56:06.782 [main] 错误 org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 错误:关系“hibernate_sequence”不存在 位置: 17

这是实体类: @Entity 公共类 TdTito {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long idTito;
private int lev;
...

public Long getIdTito() {
    return idTito;
}
public void setIdTito(Long idTito) {
    this.idTito = idTito;
}

public int getLev() {
    return lev;
}
public void setLev(int lev) {
    this.lev = lev;
}

}

通过删除注释,我在尝试启动应用程序时收到此错误:

2020-06-16 15:26:46.394 错误 23244 --- [ restartedMain] o.s.boot.SpringApplication:应用程序运行失败

org.springframework.beans.factory.BeanCreationException:创建在类路径资源[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]中定义了名称为“entityManagerFactory”的bean时出错:调用init方法失败;嵌套异常是 org.hibernate.AnnotationException: No identifier specified for entity: com.xxx..entities.mappingdb.TdTito 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108) ~[spring-context-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868) ~[spring-context-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) [spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE] 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.2.5.RELEASE.jar:2.2.5.RELEASE] 在 com.xxx..Application.main(Application.java:14) [类/:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)~[na:1.8.0_241] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_241] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_241] 在 java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_241] 在 org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.2.5.RELEASE.jar:2.2.5.RELEASE] 引起:org.hibernate.AnnotationException:未为实体指定标识符:com.xxx.。entities.mappingdb.TdTito 在 org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:266) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final] 在 org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:211) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final] 在 org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:781) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final] 在 org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:254) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final] 在 org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:230) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final] 在 org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:273) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final] 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1202) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final] 在 org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1233) ~[hibernate-core-5.4.12.Final.jar:5.4.12.Final] 在 org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) ~[spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378) ~[spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE] ...省略了 21 个常用帧

有什么建议吗?非常感谢大家 步

PostgreSQL 休眠 JPA 序列

评论

0赞 Simon Martinelli 6/12/2020
您能否发布整个堆栈跟踪并记录 SQL 语句 (logging.level.org.hibernate.SQL=debug)
0赞 steprm 6/15/2020
当然,谢谢。我刚刚添加了完整的堆栈跟踪
0赞 Simon Martinelli 6/15/2020
您还能展示 Entity 类吗?顺便说一句,为什么你使用XML而不是注解?
0赞 steprm 6/16/2020
刚刚复制了 Entity 类。我无缘无故地使用了xml...

答:

0赞 Simon Martinelli 6/16/2020 #1

如果正在使用,则必须从实体中删除所有注释

此行导致搜索hibernate_sequence:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)

只需删除此行即可。

但我建议使用使用注释。这将如下所示:

@Id 
@SequenceGenerator(name = "seq_td_tito", sequenceName = "seq_td_tito")
@GeneratedValue(generator = "seq_td_tito", strategy = GenerationType.SEQUENCE)
private Long idTito;

评论

0赞 steprm 6/16/2020
不幸的是,通过删除这些行,我在尝试启动应用程序时遇到了错误
0赞 Simon Martinelli 6/16/2020
错误是什么?难道你不想改用 Annotions 而不是 XML 吗?
0赞 steprm 6/16/2020
我已经复制了上面的错误。对我来说,移动到注释是可以的......非常感谢你,你很善良,我真的很感激
0赞 Simon Martinelli 6/16/2020
现在的问题是没有加载XML文件。您必须指定这一点。但我建议使用注释。我更新了我的答案
0赞 steprm 6/17/2020
现在它似乎工作正常。非常感谢,我真的很感激。我最诚挚的问候:)
0赞 CodeWorld 4/25/2022 #2

我挣扎了一段时间,然后为了同样的策略,遵循组合奏效了

@Id
@GeneratedValue(strategy = GenerationType.AUTO)

我有这些条目。application.properties

spring.datasource.username= postgres  
spring.datasource.password= mypassword  
spring.datasource.driver-class-name= org.postgresql.Driver  
spring.jpa.generate-ddl= true  
spring.jpa.hibernate.ddl-auto= update  
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.PostgreSQLDialect

并根据需要有一个依赖项。pom.xml

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>