【发布时间】:2020-03-25 19:53:59
【问题描述】:
JPA(休眠提供程序)和 Postgres 11
我的 Id 属性具有此配置(它是单列/属性 PK)。
由于某种原因,在对该表执行 INSERT 后,JPA 调用
select currval('yb.asset_store_id_seq')
我猜(我不确定)这样做是为了刷新新插入实体的 ID,或者可能出于某种类似原因。
但是没有这样的顺序。我的序列名为yb.asset_store_seq,我的表名为yb.asset_store。
我的实体类是AssetStore。
那么...我该如何解决这个问题?基本上,JPA 不知何故编造了这个序列名称。还是我错过了什么?!
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable=false, updatable=false)
private Integer id;
在数据库级别,序列由表拥有。
这是堆栈跟踪。
Hibernate:
select
currval('yb.asset_store_id_seq')
Mar 25, 2020 3:45:02 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 0, SQLState: 42P01
Mar 25, 2020 3:45:02 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ERROR: relation "yb.asset_store_id_seq" does not exist
Position: 16
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
...................
Caused by: org.postgresql.util.PSQLException: ERROR: relation "yb.asset_store_id_seq" does not exist
Position: 16
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
【问题讨论】:
-
看this。
-
@SternK 谢谢...你的意思是我应该使用
hibernate.jdbc.use_get_generated_keys=true或...?这似乎是一个非 JPA 标准,即一些休眠特定属性......这是解决方案还是......? -
是的,如果你的 jdbc 驱动支持的话。它将允许摆脱
select currval('yb.asset_store_id_seq')查询。 -
这似乎可行...但每个问题都会带来 3-4 个新问题 :) 谢谢。
-
JPA 并没有定义一切(它会成为一个非常臃肿的标准),因此您还需要/可以拥有特定于实现(Hibernate、EclipseLink 等)的东西。
标签: java postgresql hibernate jpa