首页 文章

Java JPA(EclipseLink)如何在持久化实体之前接收下一个GeneratedValue?

提问于
浏览
2

我正在使用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 标志 .

How can I get the auto-generated value (id field) before persisting the entity? 因此,如果表中有3个实体( id IN (1, 2, 3) ),我希望得到4作为下一个自动生成的值 .

我唯一的解决方法是:

  • 获取具有最大 id 字段的实体的ID .

这就是我所能做的一切吗?

1 回答

  • 0

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

    entityManagerFactory.getPersistenceUnitUtil().getIdentifier(attendance);
    

    DISCLAIMER: 从未尝试过 .

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

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

    或者你对你正在做的事情很满意 . 只需照顾原子性 . 或者您可能没有同时运行多个事务的情况 .

相关问题