【问题标题】:Calling next value of a sequence in jpa在jpa中调用序列的下一个值
【发布时间】:2011-03-05 07:45:36
【问题描述】:

我有一个映射为实体的类以将其保存在数据库中。我有一个 id 字段作为主键,因此每次持久化对象时,都会从序列“myClass_pk_seq”中检索 id 的值,代码如下所示。

@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;


    ...
}

我需要在“代码”属性中添加类似于 id 的内容。我需要一个序列,以便我可以分配给序列的下一个值进行编码(以保留该值,以防用户想要保留它但不保留数据)。我的意思是用户将看到该字段,如果他不知道要输入什么,他可以按下按钮并在屏幕中接收下一个可能的值(他可以接受也可以不接受)。如何在不保留非主键字段的数据的情况下获取 JPA 中定义的序列的下一个值(并增加其值)?

我只想有一个方法,它在与“代码”字段关联的序列上调用 nextval,并返回值。在 JPA 中使用注释的最佳方法是什么?

谢谢。

【问题讨论】:

  • 为什么需要“保留”它。为什么不让 JPA 处理呢
  • @Bozho 好的,我已经完全改变了我的问题,所以现在它更有意义了。

标签: java hibernate jpa sequence nextval


【解决方案1】:

我只想有一个方法,它在与“代码”字段关联的序列上调用 nextval,并返回值。在 JPA 中使用注释的最佳方法是什么?

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

这两种解决方案听起来都有些难看。也许您可以简单地使用像 UUID 生成器这样的随机生成器。

实际上,您没有提到任何关于 code 的唯一性的内容(并且 JPA 注释没有显示它必须是唯一的)。为什么不返回一个随机整数?

【讨论】:

  • 代码号必须是唯一的,但并非总是如此。当按钮被按下时,必须给出一个新的唯一值,尽管用户可以更改它并插入另一个值(甚至可以是一个已经存储在数据库中的值)。这就像让用户有机会看到下一个可能的值,他可以接受也可以不接受(但没有在数据库中保存任何内容)
  • @Javi 那为什么不使用随机生成器呢?
  • 也许它可以解决问题,或者甚至只是一个静态长属性并将其加一。
  • JPA 不支持像序列这样的原始标准数据库结构,这很痛苦。感谢您解决这个问题!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 2016-06-28
    • 2019-08-03
    • 2012-11-03
    • 2014-10-08
    • 1970-01-01
    • 2013-08-16
    • 2020-12-25
    相关资源
    最近更新 更多