簡體   English   中英

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

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

我使用休眠創建了數據庫表,並且我的用戶類具有自動生成的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;

我試圖從蟾蜍控制台中插入用戶,也將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填充列標記。 從文檔:

@GeneratedValue批注指定使用標識列,數據庫序列或表生成器自動生成實體標識符值。 Hibernate即使對UUID標識符也支持@GeneratedValue映射。

您可以設置@GeneratedValue類型。 參見https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators

這與@GeneratedValue批注無關。 即使您已使用此注釋對字段進行注釋並提供了自己的ID,它也會使用該ID而不是生成它。

由於@Id注釋,您遇到此錯誤。 此注釋使您的字段userId唯一。 這是一個主鍵,因此您不能有重復的條目。

您可以做的是代替調用session.save(entity) ,而可以調用session.update(entity)session.saveOrUpdate(entity) 如果它不存在,它將保存它,否則將對其進行更新/覆蓋。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM