sql >> データベース >  >> RDS >> Oracle

Hibernate Jpa-主キー(シーケンス)の制約違反例外

    Oracle10方言

    Oracle10gDialectの場合 この構成を使用する

    @Id
    @Column(name = "MY_PRIMARY_KEY")
    @GeneratedValue(strategy=GenerationType.AUTO)
    Long myPrimaryKey;
    

    Hibernateはテーブルとシーケンスを作成します:

    create table MY_TABLE (
    MY_PRIMARY_KEY number(19,0) not null, 
    VALUE varchar2(255 char), 
    primary key (MY_PRIMARY_KEY))
    
    create sequence hibernate_sequence 
    

    保存中に、最初に新しいシーケンスIDを取得してから、INSERTに渡します。 ステートメント

    select hibernate_sequence.nextval from dual
    insert into MY_TABLE (VALUE, MY_PRIMARY_KEY) values (?, ?)
    

    Oracle12方言

    Oracle 12を使用する場合 IDENTITY column Oracle12cDialectにアップグレードすることをお勧めします (これにはHibernate 5.3が必要であることに注意してください)

    strategyを設定します GenerationType.IDENTITY

    @Id
    @Column(name = "MY_PRIMARY_KEY", updatable = false, nullable = false)
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    Long myPrimaryKey;
    

    次のテーブルが作成されます-重要な部分はgenerated as identity これは、固有のビューを提供します。明示的なsequenceはないことに注意してください。 作成する必要があり、内部で管理されます。

    create table MY_TABLE (
    MY_PRIMARY_KEY number(19,0) generated as identity, 
    VALUE varchar2(255 char), 
    primary key (MY_PRIMARY_KEY))
    

    保存中、INSERTでIDは渡されません 、Oracleによって割り当てられ、セッションに戻されます

    insert into MY_TABLE (VALUE) values (?) RETURNING MY_PRIMARY_KEY INTO ? 
    

    Oracle 10とは異なり、データベースへのラウンドトリップを1回節約できることに注意してください。



    1. CSVからmySQLデータベースにデータをロードするJava+hibernate + spring

    2. PHPを使用してmysqlテーブルのレコードの総数を取得するための最良の方法は何ですか?

    3. nodejsとexpressを使用してクエリパラメータからmysqlデータテーブルを更新する

    4. オンラインで別のPCからMySQLデータベースに接続するにはどうすればよいですか? VB.NET