代码之家  ›  专栏  ›  技术社区  ›  Javi

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

  •  5
  • Javi  · 技术社区  · 15 年前

    我将一个类映射为一个实体,以便在数据库中持久化它。我有一个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的东西。我需要有一个序列,这样我就可以将序列的下一个值赋给code(在用户想要保留该值但不保留数据的情况下保留该值)。我的意思是用户将看到这个字段,如果他不知道输入什么,他可以按下一个按钮,然后在屏幕上接收下一个可能的值(他可以接受也可以不接受)。在不保存非主键字段的数据的情况下,如何获取JPA中定义的序列的下一个值(并增加其值)?

    我只想有一个方法,它对与“code”字段相关联的序列调用nextval,并返回值。在带有注释的JPA中,最好的方法是什么?

    谢谢。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Pascal Thivent    15 年前

    我只想有一个方法,它对与“code”字段相关联的序列调用nextval,并返回值。在带有注释的JPA中,最好的方法是什么?

    • 当用户按下按钮时,使用本机SQL获取下一个序列值。要么手动创建序列,要么使用“假实体”让JPA为您创建序列。
    • 如果不想使用本机SQL,请插入依赖序列的实体并获取其ID。

    这两种解决方案听起来都有点难看。也许你可以简单地使用一个随机生成器,比如UUID生成器。

    实际上,你没有提到 code (JPA注释没有显示它必须是唯一的)。为什么不返回一个随机整数?

        2
  •  0
  •   razvanone    8 年前

    See another question/answers on the subject of using sequence defined elsewhere than id fields . 可以使用一个字段(long id类型)创建假实体。将其连接到数据库中定义的序列。然后为该实体创建一个CruderPositive实现,并使用您定义的假实体对象的空实例调用其save()方法。Hibernate将为您运行一个“Select your seq.nextval from dual”查询。