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

时间:2017-05-17 06:06:45

标签: java sql oracle hibernate hibernate-annotations

我使用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';

4 个答案:

答案 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';