我正在使用 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 作为下一个自动生成的值。
我唯一的解决方法是:
- 获取具有最大
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/