Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara membuat kelas model entitas generik yang mendukung id generik termasuk id yang dibuat secara otomatis?

Tidak mencoba ini, tetapi menurut api Hibernate ini seharusnya tidak rumit dengan membuat implementasi kustom IdentityGenerator .

Ini menghasilkan metode get dan objek yang Anda hasilkan nilainya sehingga Anda dapat memeriksa jenis bidang id dan mengembalikan nilai yang sesuai untuk kunci utama Anda.

public class DynamicGenerator  implements IdentityGenerator

        public Serializable generate(SessionImplementor session, Object object)
                throws HibernateException {

             if (shouldUseAutoincrementStartegy(object)) { // basing on object detect if this should be autoincrement or not, for example inspect the type of id field by using reflection - if the type is Integer use IdentityGenerator, otherwise another generator 
                 return new IdentityGenerator().generate(seession, object)
             } else { // else if (shouldUseTextKey)

                 String textKey = generateKey(session, object); // generate key for your object

                 // you can of course connect to database here and execute statements if you need:
                 // Connection connection = session.connection();
                 //  PreparedStatement ps = connection.prepareStatement("SELECT nextkey from text_keys_table");
                 // (...)

                 return textKey;

            }

        }
    }

Gunakan ini sebagai strategi pembuatan Anda:

@MappedSuperclass
public abstract class BaseEntity<T> implements Serializable {
    @Id
    @GenericGenerator(name="seq_id", strategy="my.package.DynamicGenerator")
    protected T id;
}

Untuk Hibernate 4, Anda harus mengimplementasikan IdentifierGenerator antarmuka.

Seperti di atas diterima untuk Hibernate, masih mungkin untuk membuatnya dengan cara yang lebih umum untuk penyedia "sesuai jpa". Menurut api JPA di GeneratedValue anotasi Anda dapat memberikan generator khusus Anda. Ini berarti Anda dapat memberikan nama generator khusus Anda dan Anda harus mengimplementasikan generator ini untuk setiap penyedia jpa.

Ini berarti Anda perlu membuat anotasi BaseEntity dengan anotasi berikut

@MappedSuperclass
public abstract class BaseEntity<T> implements Serializable {
    @Id
    @GeneratedValue(generator="my-custom-generator")
    protected T id;
}

Sekarang Anda perlu mendaftarkan generator khusus dengan nama "generator-kustom-saya" untuk setiap penyedia jpa yang ingin Anda gunakan.

Untuk Hibernate, ini dilakukan dengan anotasi @GenericGenerator seperti yang ditunjukkan sebelumnya (menambahkan @GenericGenerator(name="my-custom-generator", strategy="my.package.DynamicGenerator" ke BaseEntity kelas di salah satu id bidang atau BaseEntity tingkat kelas harus cukup).

Di EclipseLink saya melihat bahwa Anda dapat melakukan ini melalui GeneratedValue anotasi dan mendaftarkannya melalui SessionCustomizer:

            properties.put(PersistenceUnitProperties.SESSION_CUSTOMIZER,
                    "my.custom.CustomIdGenerator");

public class CustomIdGenerator extends Sequence implements SessionCustomizer {


    @Override
    public Object getGeneratedValue(Accessor accessor,
            AbstractSession writeSession, String seqName) {
        return  "Id"; // generate the id
    }

    @Override
    public Vector getGeneratedVector(Accessor accessor,
            AbstractSession writeSession, String seqName, int size) {
        return null;
    }

    @Override
    protected void onConnect() {
    }

    @Override
    protected void onDisconnect() {
    }

    @Override
    public boolean shouldAcquireValueAfterInsert() {
        return false;
    }

    @Override
    public boolean shouldOverrideExistingValue(String seqName,
            Object existingValue) {
        return ((String) existingValue).isEmpty();
    }

    @Override
    public boolean shouldUseTransaction() {
        return false;
    }

    @Override
    public boolean shouldUsePreallocation() {
        return false;
    }

    public void customize(Session session) throws Exception {
        CustomIdGenerator sequence = new CustomIdGenerator ("my-custom-generator");

        session.getLogin().addSequence(sequence);
    }

}    

Setiap penyedia harus memberikan cara untuk mendaftarkan generator id, jadi Anda perlu menerapkan dan mendaftarkan strategi pembuatan kustom untuk masing-masing penyedia jika Anda ingin mendukung semuanya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Satu ke Banyak MySQL

  2. Rails 3 ActiveRecord:Pesan berdasarkan jumlah asosiasi

  3. Cara mengatur batas waktu untuk kueri MySQL menggunakan C API

  4. Format pilih MySql, kolom bulat

  5. Bagaimana Anda menggunakan klausa WITH di MySQL?