2017-05-17 13 views
0

私はhibernateで私のdbテーブルを作成しました。私のユーザクラスはfollwosのような自動生成されたIDを持っています。既存の自動増分テーブルに行を挿入する方法は?

私はtoadコンソールからユーザーを挿入しようとしていますが、手動でuser_idの値を追加します。私は自分のアプリケーションから新しいユーザを挿入するときに、私は次のようにエラーを取得し、

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

私は手続きで、データベースからいくつかの値を挿入する必要があり、その既存のシーケンスを使用して新しい行を挿入する方法やid(何でも)?

はUPDATE:

私は次のように@Afridiに問題のおかげで解決します。

まず、私はそのように呼ばその後

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

をUSER_IDするシーケンスの注釈を追加しました。

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

このSQLを確認しました。

select * from user_sequences where sequence_name = 'T_USER_SEQ'; 
+1

使用この: @Id @GeneratedValue(戦略= GenerationType.AUTO、発電機= "my_entity_seq_gen") @SequenceGenerator(名前= "my_entity_seq_gen"、sequenceName = "MY_ENTITY_SEQ") プライベートロングID。 – Afridi

+0

私は既に既存の値にアクセスできますか? –

答えて

0

@Afridiのおかげで問題が解決します。

まず、私はそのように呼ばその後

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

をUSER_IDするシーケンスの注釈を追加しました。

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

このSQLを確認しました。

select * from user_sequences where sequence_name = 'T_USER_SEQ'; 
1

Hibernateは自動的に列のマークを@GeneratedValueで埋めます。 DOCから:

@GeneratedValueアノテーションは、エンティティ識別子 値が自動的にID列、データベース 配列、またはテーブルジェネレータを使用して生成されることを指定します。 Hibernateは、@ GeneratedValue マッピングをUUID識別子に対してもサポートしています。

@GeneratedValueの種類を設定できます。 https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators

1

@GeneratedValue注釈とは関係ありません。この注釈でフィールドに注釈を付けて、独自のIDを提供しても、それを生成する代わりにその注釈を使用します。

@Idアノテーションのためにこのエラーが発生しています。この注釈により、フィールドはuserId固有です。それはプライマリキーなので、重複するエントリを持つことはできません。

session.save(entity)の代わりにsession.update(entity)またはsession.saveOrUpdate(entity)に電話することができます。それが存在しない場合は保存するか、更新/上書きします。

+0

あなたは正しいですが、私は何かを更新しようとしません。JDBCを使って別のデータベースの値を自分のデータベースに移動しようとしていますが、現在の値はプロシージャで作成されています。私のアプリケーションではありません。ですから重複したIDの問題が発生します。とった? –

1

Hibernateは@GeneratedValueフィールドのIDを生成するためにシーケンスを使用し、Hibernateはそのシーケンスから選択されたいくつかのIDをキャッシュします。したがって、新しい行にidを手動で割り当てると、このIDはキャッシュされたIDに違反する可能性があります。

関連する問題