Java JPA (EclipseLink) 如何在保留实际实体之前接收下一个 GeneratedValue?

标签 java jpa eclipselink auto-increment auto-generate

我正在使用 JPA 的 EclipseLink 实现,但遇到了问题。

这是我的实体类:

@Entity
@Table(name = "attendances")
public class Attendance implements Serializable {
private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Basic(optional = false) @Column(name = "id") private Short id;

....

在我的 MySQL 表(即底层数据存储)中,我还设置了 auto_increment 标志。

如何在持久化实体之前获取自动生成的值(id 字段)?所以如果表中有 3 个实体(id IN (1, 2, 3)), 我想得到 4 作为下一个自动生成的值。

我唯一的解决方法是:

  1. 获取具有最大 id 字段的实体的 id。

这就是我能做的吗?

最佳答案

如果使用 JPA 2.0,你可以试试这个,

entityManagerFactory.getPersistenceUnitUtil().getIdentifier(attendance);

免责声明:我自己从未尝试过。

否则,您可以将您的 id 生成策略更改为可以在持久化实体之前为您获取 id 的内容。例如,尝试使用表生成器生成您的 id。在这里,我找到了一个例子,Use Table Generator To Generate ID .然后您就可以直接从该表中读取值。您可能无法使用 @Id 自动处理此问题,准确地说,您最终将自己计算下一个 id。因此,您可以采用相同的想法,但自己完成所有工作并在创建操作时设置 id,不要让 JPA 生成一个。

或者您可能喜欢使用 sequence,如果支持的话。在 sequence 的情况下,您还需要自己获取下一个值并手动设置。准备好在没有插入的情况下松开跳过的 id,或者以某种方式处理它。

或者您对自己所做的事情感到满意。只需注意原子性。或者您可能没有多个事务同时运行的情况。

关于Java JPA (EclipseLink) 如何在保留实际实体之前接收下一个 GeneratedValue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6608993/

相关文章:

java - @OneToOne 实体关系的 JPA 合并

java - EclipseLink 在 Oracle DB 上生成重复的主键

hibernate - 陷阱和实际用例 : Toplink, Hibernate、Eclipse Link、Ibatis

java - 用户角色的默认值 - Spring security

java - 如何从 java Activity 调用 native Activity ?

java - 如何通过分页按任何字段搜索

java - 属性转换器日期字符串

java - 在 ConcurrentHashMap.computeIfAbsent 和 ConcurrentHashMap.computeIfPresent 中执行 `mappingFunction`

java:使用现有对象还是创建一个新对象?

java - 如何使用 JPA 和 Hibernate 修复 "ORDER BY items must appear in the select list if SELECT DISTINCT is specified"