序列生成器:JAVA/JPA/SPRING

4

问题:有没有可能不使用 select someSequence from dual; 生成序列号?

问题描述:默认情况下,@GeneratedValue@SequenceGenerator 在我的 id 中获取下一个值时会使用 select someSequence from dual;。但是我的用户没有从 dual 表中选择的权限,所以我只能使用 id = sequence.nextval ,但我不知道如何在实体类中使用它。或者应该如何将 id 值传递给实体构造函数,比如 sequence.nextval

用法:Oracle 数据库、CrudRepository、save() 方法。


请问您能否让您的问题更加清晰明了一些?如果您是想要构建一个新对象,您只需要不发送ID,系统会自动生成它。 - maha
如题所述,我正在使用@SequenceGenerator生成我的ID,这会调用select mySequence from dual;(后台进程)。但是我想使用sequence.nextval而不是使用select来获取我的ID。 - D1'
定义所使用的数据库和JPA提供程序。JPA提供了许多不同的策略可供使用,SEQUENCE只是其中之一。 - user3973283
3个回答

5

你需要先在Oracle中创建序列:

CREATE SEQUENCE USER_SEQUENCE START WITH 1 INCREMENT BY 10;

然后,将您的类注释为以下内容:
@Entity
@SequenceGenerator(name="USER_SEQUENCE_GENERATOR", sequenceName="USER_SEQUENCE", initialValue=1, allocationSize=10)
public class User {
    @Id
    @Column(name="USER_ID")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USER_SEQUENCE_GENERATOR")
    private Long userId;
}

1
我认为您需要编写自己的策略并使用GenericGenerator注释。这个答案可能对您有帮助:link

他说他在使用Hibernate吗? - user3973283

0

您可以通过以下查询插入id:

select max(id) from <<tableName>>;

如果您无法从 Dual 表中选择,则可以查询您自己的表,找到 max id,将其增加 1 并将其分配为新的 id。

是的,这是一个选项,但我想使用sequence.nextval,因为将来我不会创建递增的ID。 - D1'

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