我使用hibernate创建了我的数据库表,我的用户类有一个自动生成的id,如follwos。
@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';
答案 0 :(得分:1)
Hibernate会自动使用@GeneratedValue
填充列标记。来自doc:
@GeneratedValue批注指定实体标识符 使用标识列,数据库自动生成值 序列或表生成器。 Hibernate支持@GeneratedValue 甚至映射UUID标识符。
您可以设置@GeneratedValue
的类型。见https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators
答案 1 :(得分:1)
这与@GeneratedValue
注释无关。即使您使用此注释注释了您的字段并且您提供了自己的ID,它也会使用它而不是生成它。
由于@Id
注释,您收到此错误。此注释使您的字段userId
唯一。它是主键,因此您无法复制条目。
您可以做的不是拨打session.save(entity)
,而是拨打session.update(entity)
或session.saveOrUpdate(entity)
。如果它不存在,它将保存它,否则更新/覆盖它。
答案 2 :(得分:1)
Hibernate使用序列为@GeneratedValue
字段生成id,Hibernate将缓存从该序列中选择的一些id。因此,当您为新行手动分配ID时,此ID可能违反缓存的ID。
答案 3 :(得分:0)
由于@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';