Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Hibernasi pembuatan kunci otomatis dengan MySQL dan Oracle

Meskipun Anda menggunakan GenerationType.AUTO tanpa parameter khusus SEQUENCE, Anda tidak akan dapat menyimpan pengidentifikasi yang ditetapkan.

Ada beberapa solusi jika Anda ingin berkompromi:

  1. Salah satu caranya adalah dengan beralih ke pengidentifikasi yang ditetapkan. Anda dapat menggunakan pengenal UUID, yang berfungsi untuk MySQL dan Oracle dan Anda juga dapat menetapkan nilainya secara manual.

  2. Cara lain adalah dengan menggunakan generator tabel khusus.

Pertama, Anda menentukan antarmuka yang dapat diidentifikasi:

    public interface Identifiable<T extends Serializable> {
        T getId();
    }

Kemudian Anda memperluas generator tabel:

    public class AssignedTableGenerator extends TableGenerator {

        @Override
        public Serializable generate(SessionImplementor session, Object obj) {
            if(obj instanceof Identifiable) {
                Identifiable identifiable = (Identifiable) obj;
                Serializable id = identifiable.getId();
                if(id != null) {
                    return id;
                }
            }
            return super.generate(session, obj);
        }
    }

Generator ini dapat menggabungkan pengidentifikasi yang ditetapkan dengan pengidentifikasi yang dibuat secara sintetis:

    doInTransaction(session -> {
        for (int i = 0; i < 5; i++) {
            session.persist(new AssignTableSequenceIdentifier());
        }
        AssignTableSequenceIdentifier tableSequenceIdentifier = new AssignTableSequenceIdentifier();
        tableSequenceIdentifier.id = -1L;
        session.merge(tableSequenceIdentifier);
        session.flush();
    });

menghasilkan pernyataan berikut:

    select tbl.next_val from sequence_table tbl where tbl.sequence_name=default for update
    insert into sequence_table (sequence_name, next_val)  values (default,1)
    update sequence_table set next_val=2  where next_val=1 and sequence_name=default
    select tbl.next_val from sequence_table tbl where tbl.sequence_name=default for update
    update sequence_table set next_val=3  where next_val=2 and sequence_name=default
    select tbl.next_val from sequence_table tbl where tbl.sequence_name=default for update
    update sequence_table set next_val=4  where next_val=3 and sequence_name=default
    select tbl.next_val from sequence_table tbl where tbl.sequence_name=default for update
    update sequence_table set next_val=5  where next_val=4 and sequence_name=default
    select tbl.next_val from sequence_table tbl where tbl.sequence_name=default for update
    update sequence_table set next_val=6  where next_val=5 and sequence_name=default
    select identityvs0_.id as id1_0_0_ from assigneTableIdentifier identityvs0_ where identityvs0_.id=-1
    insert into assigneTableIdentifier (id) values (1, 2)
    insert into assigneTableIdentifier (id) values (2, 4)
    insert into assigneTableIdentifier (id) values (5, -1)

Untuk Oracle, Anda dapat menggabungkan SEQUENCE dan generator yang ditugaskan. Singkatnya, dengan mempertimbangkan generator berikut:

public class AssignedSequenceStyleGenerator 
    extends SequenceStyleGenerator {
 
    @Override
    public Serializable generate(SessionImplementor session, 
        Object obj) {
        if(obj instanceof Identifiable) {
            Identifiable identifiable = (Identifiable) obj;
            Serializable id = identifiable.getId();
            if(id != null) {
                return id;
            }
        }
        return super.generate(session, obj);
    }
}

Anda dapat memetakannya ke entitas Anda sebagai berikut:

@Id
@GenericGenerator(
    name = "assigned-sequence",
    strategy = "com.vladmihalcea.book.hpjp.hibernate.identifier.AssignedSequenceStyleGenerator",
    parameters = @org.hibernate.annotations.Parameter(
        name = "sequence_name", 
        value = "post_sequence"
    )
)
@GeneratedValue(
    generator = "assigned-sequence", 
    strategy = GenerationType.SEQUENCE
)
private Long id;

Semua kode tersedia di GitHub dan berfungsi dengan sangat baik.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membuat dan menggunakan tabel sementara dalam prosedur tersimpan Oracle?

  2. Oracle PL/SQL:Buat Paket DML Online

  3. jar jdbc apa yang digunakan dengan oracle 11g &jdk 1.6 dan bagaimana menghubungkan ke db itu sendiri

  4. Mengapa tidak ada output saat blok PLSQL Anonymous selesai?

  5. Menghubungkan ke Database Oracle menggunakan Layanan Integrasi Server Sql