Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

कैसे एक सामान्य इकाई मॉडल वर्ग बनाने के लिए जो स्वत:उत्पन्न आईडी सहित सामान्य आईडी का समर्थन करता है?

यह कोशिश नहीं की, लेकिन हाइबरनेट के एपीआई के अनुसार यह IdentityGenerator

यह उत्पन्न विधि हो जाती है और वस्तु जिसके लिए आप मूल्य उत्पन्न कर रहे हैं ताकि आप आईडी फ़ील्ड के प्रकार की जांच कर सकें और अपनी प्राथमिक कुंजी के लिए उचित मान वापस कर सकें।

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;

            }

        }
    }

इसे प्राप्त करने के बाद इसे अपनी पीढ़ी की रणनीति के रूप में उपयोग करें:

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

हाइबरनेट 4 के लिए, आपको पहचानकर्ता जेनरेटर इंटरफ़ेस।

जैसा कि हाइबरनेट के लिए उपरोक्त स्वीकार किया गया है, इसे किसी भी "जेपीए अनुपालन" प्रदाता के लिए इसे अधिक सामान्य तरीके से बनाना अभी भी संभव होना चाहिए। GeneratedValue में जेपीए एपीआई के मुताबिक एनोटेशन आप अपना कस्टम जनरेटर प्रदान कर सकते हैं। इसका मतलब है कि आप अपने कस्टम जनरेटर का नाम प्रदान कर सकते हैं और आपको प्रत्येक जेपीए प्रदाता के लिए इस जनरेटर को लागू करना चाहिए।

इसका मतलब यह होगा कि आपको निम्नलिखित एनोटेशन के साथ BaseEntity को एनोटेट करना होगा

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

अब आपको प्रत्येक जेपीए प्रदाता के लिए "my-custom-generator" नाम से कस्टम जनरेटर पंजीकृत करने की आवश्यकता है जिसका आप उपयोग करना चाहते हैं।

हाइबरनेट के लिए यह निश्चित रूप से @GenericGenerator एनोटेशन द्वारा किया जाता है जैसा कि पहले दिखाया गया है (@GenericGenerator(name="my-custom-generator", strategy="my.package.DynamicGenerator" जोड़कर करने के लिए BaseEntity या तो id . पर क्लास फ़ील्ड या BaseEntity कक्षा स्तर पर्याप्त होना चाहिए)।

एक्लिप्सलिंक में मैंने देखा है कि आप इसे GeneratedValue एनोटेशन और इसे सेशन कस्टमाइज़र के माध्यम से पंजीकृत करना:

            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);
    }

}    

प्रत्येक प्रदाता को आईडी जनरेटर को पंजीकृत करने का एक तरीका देना होगा, इसलिए यदि आप उन सभी का समर्थन करना चाहते हैं तो आपको प्रत्येक प्रदाता के लिए कस्टम पीढ़ी की रणनीति को लागू करने और पंजीकृत करने की आवश्यकता होगी।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL InnoDB:ऑटोइनक्रिकमेंट गैर-प्राथमिक कुंजी

  2. MySQL में कर्सर का उपयोग करते समय DECLARE कथन से संग्रहीत कार्यविधि को कॉल करें

  3. MySQL Group_Concat रिपीटिंग वैल्यूज

  4. MySQL विदेशी कुंजी NULL को अनुमति देने के लिए?

  5. MySQL में utf8mb4 का उपयोग करना