हाइबरनेट-अनुक्रम मौजूद नहीं है


88

मैंने अपने प्रोजेक्ट में वसंत 4.2संस्करण के साथ 4 से 5 तक हाइबरनेट को अपग्रेड करने की कोशिश की । इस अपग्रेड के बाद, मैंने अपने स्टैक ट्रेस में निम्न त्रुटि पाई जब मैंने अपडेट करने के लिए एक विधि को बुलाया।

10:53:32,185 ERROR TableStructure:149 - could not read a hi value
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist 

मैंने एनोटेशन के साथ ऑटो इंक्रीमेंट आईडी को बदल दिया

@GeneratedValue(strategy=GenerationType.AUTO) 

अभी भी त्रुटि बनी हुई है।


4
कॉन्फ़िग फ़ाइल `<प्रोप key =" hibernate.id.new_generator_mappings "> झूठी में स्थापित करने की कोशिश </ प्रोप>
ईवा मरियम

जवाबों:


123

आप भी डाल सकते हैं:

@GeneratedValue(strategy = GenerationType.IDENTITY)

और DateBase को प्राथमिक कुंजी की वृद्धि का प्रबंधन करने दें:

AUTO_INCREMENT PRIMARY KEY

13
यह कुछ मामलों में अच्छा हो सकता है, लेकिन इसमें एक स्पष्ट खामी है: हर INSERTव्यक्ति को आईडी लाने के लिए डेटाबेस में एक अतिरिक्त गोल यात्रा का कारण होना चाहिए। तो जब यह कमी स्वीकार्य है, ठीक है।
जी। डेमेकी

@ G.Demecki क्या आप इस दौर यात्रा विधि के विपरीत हाइबरनेट्स पहचान जनरेटर का उपयोग करने के पेशेवरों और विपक्षों पर चर्चा कर पाएंगे? वास्तव में उपयोगी होगा!
जॉर्डन मैकी

82

आपको Hibernate5.x के लिए सेट करने की आवश्यकता है <property name="hibernate.id.new_generator_mappings">false</property>.. देखें और लिंक करें

हाइबरनेट 4.x के पुराने संस्करण के लिए: <prop key="hibernate.id.new_generator_mappings">false</prop>


यह कहाँ जोड़ा जाता है?
सैमुअल थॉम्पसन

1
इसे हाइबरनेट गुणों में जोड़ें।
rParvathi


10
आपका उत्तर प्रश्न का समाधान हो सकता है, लेकिन यह नहीं बताता है कि यह समस्या का समाधान क्यों करता है। कृपया ध्यान रखें, लिंक मर जाते हैं।
क्लिजस्टर्स

51

स्प्रिंग बूट के साथ काम करना

समाधान

.Application.properties में नीचे स्ट्रिंग रखें

spring.jpa.properties.hibernate.id.new_generator_mappings=false

व्याख्या

Hibernate 4.X पर यह विशेषता डिफॉल्ट करती है true


30

इस त्रुटि के पीछे यही कारण है:

यह खोज करेगा कि आप जिस डेटाबेस का उपयोग कर रहे हैं वह आईडी कैसे बनाता है। MySql या HSQSL के लिए, वहाँ वेतन वृद्धि क्षेत्र हैं जो स्वचालित रूप से वेतन वृद्धि करते हैं। Postgres या Oracle में, वे अनुक्रम तालिकाओं का उपयोग करते हैं। चूंकि आपने एक अनुक्रम तालिका नाम निर्दिष्ट नहीं किया था, इसलिए यह एक सीक्वेंस टेबल की खोज करेगा जिसका नाम hibernate_fterence है और इसे डिफ़ॉल्ट रूप से उपयोग करें। तो आपके डेटाबेस में शायद ऐसी कोई अनुक्रम तालिका नहीं है और अब आपको वह त्रुटि मिल जाएगी।


1
एक उत्तर के रूप में चिह्नित किया जाना चाहिए क्योंकि यह चीजों को सरलता से बताता है - "स्प्रिंग.jpa.properties.hibernate.id.new_generator_mappings = false" का एक अतिरिक्त उल्लेख किया जाना चाहिए लेकिन धन्यवाद।
रात का समय

15

मुझे एक ही त्रुटि मिल रही थी "com.mysql.jdbc.exception.jdbc4.MySQLSyntaxErrorException: Table 'mylocaldb.hibernate_fterence' मौजूद नहीं है"।

स्प्रिंग एमएक्स 4.3.7 और हाइबरनेट संस्करण 5.2.9 का उपयोग करके, स्प्रिंग जावा आधारित कॉन्फ़िगरेशन का उपयोग करके आवेदन किया जाता है। अब मुझे hibernate.id.new_generator_mappingsमेरे कोड में @Eva मरियम द्वारा उल्लिखित संपत्ति को इस तरह जोड़ना होगा:

@Autowired
    @Bean(name = "sessionFactory")
    public SessionFactory getSessionFactory(DataSource dataSource) {

        LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
        sessionBuilder.addProperties(getHibernateProperties());
        sessionBuilder.addAnnotatedClasses(User.class);

        return sessionBuilder.buildSessionFactory();
    }

    private Properties getHibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        properties.put("hibernate.id.new_generator_mappings","false");
        return properties;
    }

और यह आकर्षण की तरह काम करता था।


14

FYI करें

यदि आप O / R मैपिंग को परिभाषित करने के लिए hbm ​​फ़ाइलों का उपयोग कर रहे हैं।

नोटिस जो:

हाइबरनेट 5 में, अनुक्रम नाम का परम नाम बदल दिया गया है

निम्नलिखित सेटिंग ने हाइबरनेट 4 में ठीक काम किया :

<generator class="sequence">
    <param name="sequence">xxxxxx_seq</param>
</generator>

लेकिन हाइबरनेट 5 में , एक ही मैपिंग सेटिंग फ़ाइल "hibernate_fterence मौजूद नहीं है" त्रुटि का कारण होगा।

इस त्रुटि को ठीक करने के लिए, परम नाम में बदलना होगा:

<generator class="sequence">
    <param name="sequence_name">xxxxxx_seq</param>
</generator>

इस समस्या ने मुझे 2, 3 घंटे बर्बाद कर दिए।

और किसी तरह, ऐसा लगता है कि इसके बारे में कोई दस्तावेज़ नहीं हैं ।

मुझे जानने के लिए org.hibernate.id.enhanced.SequenceStyleGenerator का स्रोत कोड पढ़ना होगा


7

जब आप उपयोग करते हैं

@GeneratedValue(strategy=GenerationType.AUTO)

या

@GeneratedValue ऊपर का छोटा रास्ता है, हाइबरनेट आपके लिए सबसे अच्छी पीढ़ी की रणनीति तय करना शुरू करता है, इस मामले में यह चुना गया है

GenerationType.SEQUENCE रणनीति के रूप में और इसीलिए इसकी तलाश है

schemaName.hibernate_sequence जो अनुक्रम आधारित आईडी पीढ़ी के लिए एक तालिका है।

जब आप GenerationType.SEQUENCEरणनीति का उपयोग करते हैं तो आपको @TableGeneratorनिम्न प्रकार प्रदान करने की आवश्यकता होती है।

     @Id
     @GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator")
     @TableGenerator(name = "user_table_generator",
                table = "user_keys", pkColumnName = "PK_NAME", valueColumnName = "PK_VALUE")
     @Column(name = "USER_ID")
     private long userId;

जब आप इसे करने के लिए रणनीति निर्धारित करते हैं

@GeneratedValue(strategy = GenerationType.IDENTITY)

मूल मुद्दा हल हो जाता है क्योंकि तब सीक्वेंस टेबल की तलाश में हाइबरनेट रुक जाता है।


6

जैसे ही कोई इस समस्या से अपने बाल खींचता है जैसे मैंने आज किया, मैं इस त्रुटि को हल नहीं कर सकता जब तक कि मैं बदल नहीं गया

spring.jpa.hibernate.dll-auto=create

सेवा

spring.jpa.properties.hibernate.hbm2ddl.auto=create

5

हाइबरनेट 5.x में, आपको हाइबरनेट में गलत तरीके से सेट hibernate.id.new_generator_mappings जोड़ना चाहिए।

<session-factory>
    ......
    <property name="show_sql">1</property>
    <property name="hibernate.id.new_generator_mappings">false</property>
     ......
 </session-factory>

2

आप भी डाल सकते हैं:

@GeneratedValue(strategy = GenerationType.IDENTITY)

और DateBase को प्राथमिक कुंजी की वृद्धि का प्रबंधन करने दें:

AUTO_INCREMENT PRIMARY KEY

उपरोक्त उत्तर ने मेरी मदद की।


1

यदि आप हाइबरनेट 5 से पहले हाइबरनेट संस्करण का उपयोग कर रहे हैं @GeneratedValue(strategy = GenerationType.IDENTITY)तो एक आकर्षण की तरह काम करता है। लेकिन Hibernate5 को पोस्ट करना निम्नलिखित फिक्स आवश्यक है।

@Id
@GeneratedValue(strategy= GenerationType.AUTO,generator="native")
@GenericGenerator(name = "native",strategy = "native")
private Long id;

DDL

`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY

कारण

हाइबरनेट-मुद्दे से अंश

वर्तमान में, यदि hibernate.id.new_generator_mappings गलत पर सेट किया गया है, तो @GeneratedValue (रणनीति = GenerationType.AUTO) मूल में मैप किया जाता है। यदि यह गुण सत्य है (जो 5.x में मान का मान है), तो @GeneratedValue (रणनीति = GenerationType.AUTO) को हमेशा SequenceStyleGenerator पर मैप किया जाता है।

इस कारण से, किसी भी डेटाबेस पर जो मूल रूप से अनुक्रमों (जैसे MySQL) का समर्थन नहीं करता है, हम पहचान के बजाय टेबल जनरेटर का उपयोग करने जा रहे हैं।

हालाँकि, TABLE जनरेटर, हालाँकि अधिक पोर्टेबल है, हर बार एक अलग लेन-देन का उपयोग करता है जो डेटाबेस से एक मूल्य प्राप्त किया जा रहा है। वास्तव में, भले ही IDENTITY JDBC बैच अपडेट को निष्क्रिय कर देती है और TABLE जनरेटर पूल किए गए ऑप्टिमाइज़र का उपयोग करता है, लेकिन IDENTITY अभी भी बेहतर है।


0

यह HHH-10876 के कारण हो सकता है जो ठीक हो गया है इसलिए सुनिश्चित करें कि आप इसे अपडेट करें:

  • हाइबरनेट ORM 5.2.1,
  • हाइबरनेट ORM 5.1.1,
  • हाइबरनेट ORM 5.0.11

1
मैं स्प्रिंग-डेटा-जेपीए का उपयोग कर रहा हूं जो आंतरिक Hibernate 5.2.17.Finalरूप से कार्यान्वयन के रूप में उपयोग कर रहा है। मुझे अभी भी यह मुद्दा मिल रहा है कि कब GenerationTypeहै AUTO
कोडर

0

मैंने पोस्टग्रेज में हाइबरनेट अनुक्रम जोड़ा। PostGres Editor में यह क्वेरी चलाएँ:

    CREATE SEQUENCE hibernate_sequence
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 2
  CACHE 1;
ALTER TABLE hibernate_sequence
  OWNER TO postgres;

मैं क्वेरी का उपयोग करने के पेशेवरों / विपक्षों का पता लगाऊंगा लेकिन किसी ऐसे व्यक्ति के लिए जिसे सहायता की आवश्यकता है वह इसका उपयोग कर सकता है।


0

मेरे मामले में, सभी एनोटेशन GenerationType.AUTOको GenerationType.SEQUENCEहल करके समस्या को हल किया गया।


-2

इस क्वेरी को चलाएं

create sequence hibernate_sequence start with 1 increment by 1

आपसे अनुरोध है कि विवरणों को साझा करें कि यह समस्या को कैसे हल करता है और आपका उत्तर अन्य उत्तरों की तुलना में बेहतर है ...
सूरज कुमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.