java - JPA, hibernate 。如何从@TableGenerator 获取下一个值

标签 java hibernate jpa

我有一个具有以下主键生成策略的实体类

@Id
@Column(name = "id", nullable = false)
@TableGenerator(name = "USERGENERATOR", table = "my_sequences", pkColumnName = "sequence_name", pkColumnValue = "user_id", valueColumnName = "next_value")
@GeneratedValue(strategy = GenerationType.TABLE, generator = "USERGENERATOR")
protected Integer id;

在我需要使用 native 查询插入新行的新需求出现之前,这一直运行良好。由于实体继承策略 (@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)) 到位,主键列不使用 auto_increment。

我想知道是否有办法使用 EntityManager 向表生成器询问下一个值。

最佳答案

我认为您无法通过任何公共(public) API 访问 @TableGenerator,但使用 native SQL 获取下一个值很容易。只需使用这两个查询:

-- get the current value
select next_value from my_sequences where sequence_name = 'user_id';
-- update value
update my_sequences set next_value = next_value + 1;

如果 @TableGenerator 同时获取下一个值,则存在冲突的风险。

关于java - JPA, hibernate 。如何从@TableGenerator 获取下一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39251174/

相关文章:

spring - JPA 事务未提交到数据库

Tomcat 上的 Java 持久性 - 没有名为 EntityManager 的持久性提供程序

java - EntityManagerFactory接口(interface)[interface javax.persistence.EntityManagerFactory]似乎与Spring的EntityManagerFactoryInfo mixin冲突

java - 为带有页码指示的 XWPFDocument 创建目录

Javamail 1.5.1、Tomcat 7 和 java.lang.ClassNotFoundException : javax. mail.Authenticator

java - entitymanager.find 使用外键的主键执行查找查询

java - 为什么 Hibernate 转而使用 LONG 而不是 CLOB?

java - 我的entityManager.persist(entity) 没有抛出PersistenceException

java - 多命名空间包信息 Java

java - Selenium InternetExplorerDriver 没有将焦点放在窗口上