在JPA中调用序列的下一个值

7

我有一个映射为实体的类,用于将其持久化到数据库中。我有一个id字段作为主键,因此每次对象被持久化时,id的值都从序列"myClass_pk_seq"中检索出来,代码如下。

@Entity
@Table(name="myObjects")
public class MyClass {
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
    @SequenceGenerator(name="sequence", sequenceName="myClass_pk_seq", allocationSize=1)
    @Column(name="myClassId")
    private Integer id;

    private Integer code;


    ...
}

我需要在"code"属性中创建类似于id的东西。我需要有一个序列,以便我可以将下一个序列值分配给代码(以保留该值以防用户想要预订但不保留数据)。我的意思是,用户将看到该字段,如果他不知道输入什么,他可以按一个按钮,在屏幕上接收到下一个可能的值(他可以接受或拒绝)。如何获取在JPA中定义的序列的下一个值(并增加其值),而不为非主键字段持久化数据?我只想要一个方法,它调用与"code"字段相关联的序列上的nextval,并返回该值。在JPA中使用注释实现这个功能的最佳方法是什么?谢谢。

为什么需要“预留”它呢?为什么不让JPA处理它? - Bozho
@Bozho 好的,我已经完全改变了我的问题,现在更加有意义。 - Javi
请参考以下链接https://dev59.com/inVC5IYBdhLWcg3wfhKL - Gregor
2个回答

4
我只想要一种方法,可以在与“code”字段关联的序列上调用nextval,并返回值。 在JPA中使用注解做到这一点的最佳方法是什么?
  • 当用户按下按钮时,使用本机SQL获取下一个序列值。手动创建序列或使用“虚拟实体”使JPA为您创建它。
  • 如果不想使用本机SQL,则插入依赖于序列并获取其ID的实体。

两种解决方案听起来有点丑陋。也许你可以简单地使用像UUID生成器这样的随机生成器。

实际上,您没有提及code的唯一性(JPA注释也未显示必须唯一)。为什么不返回一个随机整数?


代码编号必须是唯一的,但并非总是如此。当按钮被按下时,必须提供一个新的唯一值,尽管用户可以更改它并插入另一个值(甚至可以是已存储在数据库中的值)。就像给用户一个机会来查看下一个可能的值,他可以接受或不接受(但不保存任何内容在数据库中)。 - Javi
@Javi那为什么不使用随机生成器呢? - Pascal Thivent
也许它可以解决问题,或者只是一个静态的长属性并将其递增一。 - Javi
很遗憾JPA不支持序列这样的基本标准数据库构造。感谢您的澄清! - Gregor

-1

查看关于在非id字段中使用先前定义的序列的其他问题/答案。您可以创建一个带有一个字段(类型为Long id)的虚拟实体,并将其连接到您在数据库中定义的序列。然后,为该实体创建一个CrudRepository实现,并使用您定义的虚拟实体对象的空实例调用其save()方法。Hibernate将为您运行“select YOUR_SEQ.NEXTVAL from dual”查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接