2013-12-08 17 views
6

मैं लूपिंग सूची और डेटाबेस में सम्मिलित हूं, लेकिन यह एक-एक करके रिकॉर्ड अपडेट कर रहा है। आखिरकार मैं डेटाबेस में केवल सूची के अंतिम रिकॉर्ड देख रहा हूं।हाइबरनेट का उपयोग कर डेटाबेस में एकाधिक पंक्तियों को कैसे सम्मिलित करें?

इनपुट नाम: लिनक्स, विंडोज, मैक

Session session = (Session) HibernateUtil.getSessionFactory().openSession(); 
String[] items = pi.getNewLicenseName().split(","); 
for (String item : items) 
{ 
feature.setName(item); 
session.save(feature); 
} 
session.getTransaction().commit(); 
HibernateUtil.shutdown(); 

hibernate.cfg.xml:

<hibernate-configuration> 

    <session-factory> 


    <property name="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> 
    <property name="connection.url">jdbc:sqlserver://******</property> 
    <property name="connection.username">*****</property> 
    <property name="connection.password">*****</property> 

    <property name="dialect">org.hibernate.dialect.SQLServerDialect</property> 


     <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> 

     <property name="hibernate.current_session_context_class">thread</property> 
<property name="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property> 


     <property name="show_sql">true</property> 
<property name="hibernate.hbm2ddl.auto">update</property> 

     <!-- Names the annotated entity class --> 

     <mapping class="com.DAO.Feature"/> 

    </session-factory> 

यहाँ तीन बार पाश और database.But में डालने किसी भी तरह values.Because अधिलेखन मिल मैं कंसोल में चल रहा एसक्यूएल डालने और अद्यतन देख रहा हूँ।

Hibernate: insert into FEATURE (NAME) values (?) 
Hibernate: update FEATURE set NAME=? where FEATURE_ID=? 

कृपया मुझे डेटाबेस में एकाधिक पंक्तियों को सम्मिलित करने के लिए मदद।

उत्तर

21

batch processing in the Hibernate docs के बारे में एक बहुत अच्छा अध्याय है।

सेट संपत्ति

hibernate.jdbc.batch_size 20 

तो सुनिश्चित करें कि आप जैसे कि आपका आईडी पीढ़ी रणनीति के लिए प्रभाव पर विचार बनाने के लिए इस कोड

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 

for (int i=0; i<100000; i++) { 
    Customer customer = new Customer(.....); 
    session.save(customer); 
    if (i % 20 == 0) { //20, same as the JDBC batch size 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 

tx.commit(); 
session.close(); 

का उपयोग discussed here

अद्यतन 2015-09-23

मैं अंत में समय बैठ जाओ और http://frightanic.com/software-development/jpa-batch-inserts/ पर एक विस्तृत लेख लिखने के लिए मिल गया।

4

एक सत्र में save() विधि के साथ, हाइबरनेट एक वस्तु को जोड़ता है और यह सत्र तब भी रहता है जब सत्र सक्रिय रहता है। इसलिए, यदि आप एक ही ऑब्जेक्ट का उपयोग करते हैं, तो आप वास्तव में मौजूदा पंक्ति को अपडेट करते हैं। समाधान हर पंक्ति के लिए एक नई वस्तु का निर्माण करना है। इस मामले में:

for (String item : items) 
{ 
    Feature feature = new Feature(); 
    feature.setName(item); 
    session.save(feature); 
} 
+0

बहुत अच्छे, आपका सू-बहुत धन्यवाद। – user2848031

+1

एक कारण है कि हाइबरनेट आपके प्रस्तावित समाधान को "निष्पक्ष दृष्टिकोण" कहता है (मेरे उत्तर में दस्तावेज़ों का लिंक देखें)। आपको वास्तव में ऐसा नहीं करना चाहिए ... –

+0

आप सही हैं, लेकिन सवाल बैच अद्यतन करने के तरीके के मुकाबले केवल एक प्रविष्टि क्यों किया गया था उससे संबंधित था। –

-1
session.merge(object); 
session.flush(); 
session.clear(); 
संबंधित मुद्दे

 संबंधित मुद्दे