sql >> Databasteknik >  >> RDS >> Mysql

Hur skapar man en generisk enhetsmodellklass som stöder generiska id inklusive autogenererade id?

Testade inte detta, men enligt Hibernates api borde detta inte kompliceras genom att skapa anpassad implementering av IdentityGenerator .

Det är genereringsmetoden får och objekt som du genererar värdet för så att du kan kontrollera typen av id-fält och returnera lämpligt värde för din primärnyckel.

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;

            }

        }
    }

Använd det helt enkelt som din generationsstrategi:

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

För Hibernate 4 bör du implementera IdentifierGenerator gränssnitt.

Som ovan är accepterat för Hibernate bör det fortfarande vara möjligt att skapa det på ett mer generiskt sätt för alla "jpa-kompatibla" leverantörer. Enligt JPA api i GeneratedValue anteckning du kan tillhandahålla din anpassade generator. Det betyder att du kan ange namnet på din anpassade generator och du bör implementera denna generator för varje jpa-leverantör.

Detta skulle innebära att du måste kommentera BaseEntity med följande anteckning

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

Nu måste du registrera en anpassad generator med namnet "my-custom-generator" för varje jpa-leverantör du vill använda.

För Hibernate görs detta surt av @GenericGenerator-kommentaren som visas tidigare (lägger till @GenericGenerator(name="my-custom-generator", strategy="my.package.DynamicGenerator" till BaseEntity klass på antingen id eller BaseEntity klassnivån bör vara tillräcklig).

I EclipseLink ser jag att du kan göra detta via GeneratedValue anteckning och registrera den via 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);
    }

}    

Varje leverantör måste ge ett sätt att registrera id-generator, så du måste implementera och registrera anpassad genereringsstrategi för var och en av leverantörerna om du vill stödja dem alla.



  1. Hur använder man bilder i Android SQLite som är större än begränsningarna för ett CursorWindow?

  2. Mysql får sista id för specifik tabell

  3. Postgres-fråga för att kontrollera en sträng är ett nummer

  4. Hur man får antalet bitar i en sträng i MySQL – BIT_LENGTH()