如何在 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';
我用 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';