如何在 oracle 中向现有的自动增量 table 插入一行?

How to insert a row to an existing auto increment table in oracle?

我用 hibernate 创建了我的数据库表,我的用户 class 有一个像 follwos 一样自动生成的 ID。

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_Id")
    private int userId;

    @Column(name = "username", nullable = false)
    private String username;

    @Column(name = "password", nullable = false)
    private String password;

我正在尝试从 toad 控制台插入用户,我还手动添加了 user_id 值。当我想从我的应用程序中插入一个新用户时,出现如下错误,

java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (TDM.SYS_C001668192) violated

我必须使用过程从数据库中插入一些值,那么如何使用现有序列或 ID(无论)插入新行?

更新:

感谢@Afridi,我解决了这个问题,如下所示。

首先,我在 user_id

中添加了序列注释
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "t_user_id_seq_generator")
    @SequenceGenerator(name = "t_user_id_seq_generator", sequenceName = "t_user_seq")
    @Column(name = "user_Id")
    private int userId;

后来我就这么叫了;

insert into t_user (user_id, username) values(T_USER_SEQ.nextval, 'newUser');

我检查了这个sql;

select * from user_sequences where sequence_name = 'T_USER_SEQ';

Hibernate 自动用 @GeneratedValue 填充列标记。来自文档:

The @GeneratedValue annotation specifies that the entity identifier value is automatically generated using an identity column, a database sequence, or a table generator. Hibernate supports the @GeneratedValue mapping even for UUID identifiers.

您可以设置 @GeneratedValue 的类型。参见 https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators

这与 @GeneratedValue 注释无关。即使您已使用此注释对您的字段进行注释并提供了您自己的 ID,它也会使用它而不是生成它。

您收到此错误是因为 @Id 注释。此注释使您的字段 userId 独一无二。这是一个主键,所以你不能有重复的条目。

您可以调用 session.update(entity)session.saveOrUpdate(entity) 而不是调用 session.save(entity)。如果它不存在,它将保存它,否则 update/overwrite 它。

Hibernate 使用序列为 @GeneratedValue 字段生成 id,Hibernate 将缓存从该序列中选择的一些 id。因此,当您手动为新行分配 id 时,此 id 可能会违反缓存的 id。

感谢@Afridi,我解决了这个问题,如下所示。

首先,我在 user_id

中添加了序列注释
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "t_user_id_seq_generator")
@SequenceGenerator(name = "t_user_id_seq_generator", sequenceName = "t_user_seq")
@Column(name = "user_Id")
private int userId;

后来我就这么叫了;

insert into t_user (user_id, username) values(T_USER_SEQ.nextval, 'newUser');

我检查了这个sql;

select * from user_sequences where sequence_name = 'T_USER_SEQ';