插入后出现JPA-PK属性问题



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;

在DB级别上,序列由表所有。

这是堆栈跟踪。

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)

首先hibernate文档根本不建议使用GenerationType.IDENTITY策略:

重要的是要认识到,使用IDENTITY列会带来运行时行为,其中实体行必须在标识符值已知之前物理插入。

这可能会打乱扩展持久性上下文(长时间对话(。由于运行时强加/不一致,Hibernate建议使用其他形式的标识符值生成(例如SEQUENCE(。

选择IDENTITY生成还有另一个重要的运行时影响:Hibernate将无法使用IDENTITY生成器为实体批处理INSERT语句。

但如果你不能更改它,并且你使用JDBC3+驱动程序和JRE1.4+。我建议明确定义:

<property name="hibernate.jdbc.use_get_generated_keys">true</property>

因为根据这个

hibernate.jdbc.use_get_generated_keys(例如true或false(

允许Hibernate在插入后使用JDBC3 PreparedStatement.getGeneratedKeys((来检索本机生成的密钥。您需要JDBC3+驱动程序和JRE1.4+。如果您的驱动程序与Hibernate标识符生成器有问题,请禁用此属性默认情况下,它尝试从连接元数据中检测驱动程序功能

它可以避免您的问题。

最新更新