sql >> Databáze >  >> RDS >> Mysql

Jak vytvořit třídu obecného modelu entity, která podporuje obecné ID včetně automaticky generovaných ID?

Nezkoušeli jsme to, ale podle rozhraní API Hibernate by to nemělo být komplikované vytvořením vlastní implementace IdentityGenerator .

Je to metoda generování get a objekt, pro který generujete hodnotu, takže můžete zkontrolovat typ pole id a vrátit vhodnou hodnotu pro váš primární klíč.

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;

            }

        }
    }

Jednoduše to použijte jako svou generační strategii:

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

Pro Hibernate 4 byste měli implementovat IdentifierGenerator rozhraní.

Vzhledem k tomu, že výše je akceptována pro Hibernate, mělo by být stále možné vytvořit ji obecnějším způsobem pro jakéhokoli poskytovatele „kompatibilního s jpa“. Podle JPA api v GeneratedValue anotace můžete poskytnout svůj vlastní generátor. To znamená, že můžete zadat název svého vlastního generátoru a tento generátor byste měli implementovat pro každého poskytovatele jpa.

To by znamenalo, že musíte BaseEntity anotovat následující anotací

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

Nyní musíte zaregistrovat vlastní generátor s názvem "my-custom-generator" pro každého poskytovatele jpa, kterého chcete používat.

V případě Hibernate je to surově provedeno pomocí anotace @GenericGenerator, jak je uvedeno výše (přidáním @GenericGenerator(name="my-custom-generator", strategy="my.package.DynamicGenerator" na BaseEntity třídy na id pole nebo BaseEntity úroveň třídy by měla být dostatečná).

V EclipseLink vidím, že to můžete udělat pomocí GeneratedValue anotaci a její registraci přes 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);
    }

}    

Každý poskytovatel musí umožnit registraci generátoru id, takže pokud chcete podporovat všechny, budete muset implementovat a zaregistrovat vlastní strategii generování pro každého poskytovatele.



  1. SQL UNION Cheat Sheet s 10 snadnými a užitečnými tipy

  2. Jíst naše vlastní krmivo pro psy – Spuštění JIRA na MariaDB

  3. Dotaz na několik NEXTVAL ze sekvence v jednom příkazu

  4. Importujte data z tabulky Excel nebo CVS do MySQL