2012-03-13 16 views
7

मैं स्टार्टअप पर एक टेक्स्ट फ़ाइल से अपने डीबी की कुछ टेबल भरना चाहता हूं, मैं चाहता हूं कि मेरा प्रारंभिक तरीका केवल तभी कॉल किया जाए जब मेरा एप्लिकेशन शुरू हो जाए।स्प्रिंग वेब एप्लिकेशन: स्टार्टअप (प्रारंभिकरण) पर कुछ कर रहा है

मैं स्प्रिंग (+ एमवीसी) और हाइबरनेट का उपयोग MySQL के साथ कर रहा हूं।

मैं कैसे कर सकता हूं?

+0

[स्टार्टअप पर डेटाबेस से वसंत वेब अनुप्रयोग प्रारंभ] (के संभावित डुप्लिकेट http://stackoverflow.com/questions/ 70825 9 4/स्प्रिंग-वेब-एप्लिकेशन-स्टार्टअप-से-डेटाबेस-ऑन-स्टार्टअप) –

+1

@ टोमाज़ नर्कविचज़: http://stackoverflow.com/questions/7082594/spring-web-plication-initialization-from का डुप्लिकेट नहीं है -डेटाबेस-ऑन-स्टार्टअप, क्योंकि सूचना प्रवाह दूसरी तरफ है, इसलिए कोई समस्या हल करने के अन्य तरीकों का उपयोग कर सकता है। – Ralph

+0

यह बहुत समान है। मेरा थोड़ा और सामान्य है। –

उत्तर

5

एक सेम के अंदर कहीं न कहीं postconstuct एनोटेशन का उपयोग करें:

@PostConstruct 
public void init() { 
    //startup logic here 
} 

शायद एक विन्यास सेम का उपयोग करने के (desgin) समझ में आता है, लेकिन यह किसी भी सेम हो सकता है।

+0

ठीक है तो सही तरीका "प्रारंभकर्ता" बना सकता है सिंगलटन और @ पोस्ट एक विधि का निर्माण? धन्यवाद! :) –

+0

यह AsyncTasks शुरू करने के लिए काम नहीं करता है। नीचे sinuhepop की सिफारिश का प्रयोग करें - http://stackoverflow.com/a/9680800/1019307 – HankCa

7

हाइबरनेट एसक्यूएल कथन के साथ कुछ फाइलें जोड़ने के लिए एक तरीका है जो स्टार्टअप पर निष्पादित किया जाएगा।

पैरामीटर hibernate.hbm2ddl.import_files है।

@See Hibernate Reference: Chapter 3.4. Optional configuration properties

  • तालिका 3.7। विविध गुण
  • hibernate.hbm2ddl.import_files:

SQL DML SessionFactory निर्माण के दौरान निष्पादित बयान युक्त वैकल्पिक फ़ाइलों की अल्पविराम द्वारा अलग नाम। परीक्षण या प्रदर्शन के लिए यह उपयोगी है: उदाहरण के लिए INSERT कथन जोड़कर आप पर तैनात डेटा के न्यूनतम सेट के साथ अपने डेटाबेस को पॉप्युलेट कर सकते हैं।

फ़ाइल आदेश महत्वपूर्ण है, से पहले निम्नलिखित फ़ाइलों के बयान से पहले एक देरी फ़ाइल के बयान निष्पादित किए जाते हैं। ये कथन केवल निष्पादित किए गए हैं यदि स्कीमा बनाया गया है यानी यदि hibernate.hbm2ddl.auto सेट या बनाने के लिए सेट है।

उदा। /humans.sql,/dogs.sql

मैं शौकीन कुछ संकेत है कि यह केवल अगर हाइबरनेट 'बनाने' मोड में शुरू कर दिया है काम कर सकते हैं। किंतु मुझे यकीन नहीं है।

+0

बहुत उपयोगी। यह सवाल का जवाब नहीं है लेकिन .... मुझे बस यही चाहिए! धन्यवाद! हालांकि, मैं import_files काम नहीं कर सकता :(इसके बजाय मैंने अपने क्लासपाथ में "import.sql" रखा है, यह पूरी तरह से निष्पादित करता है! –

16

आप एक एप्लिकेशन श्रोता बना सकते हैं, यह विशेष रूप से ऐसी आवश्यकताओं के लिए डिज़ाइन किया गया है। इस मामले में संदर्भ हर बार निष्पादित किया जाएगा (या ताज़ा)।

@Component 
public class DatabaseFillerOnStartup implements ApplicationListener<ContextRefreshedEvent> { 
    @Override 
    public void onApplicationEvent(ContextRefreshedEvent event) { 
     ... 
    } 
} 
+0

उपयोगी, धन्यवाद :) –

+0

बिल्कुल मैं जो स्वयं-निदान करने की तलाश में था । धन्यवाद! – Marquee

+0

यह जवाब होना चाहिए ... :) –

0

दो विकल्प,

पहले: एक init- साथ बीन करते हाइबरनेट अपने DDL हर बनाने सेवाओं स्टार्टअप (केवल स्थानीय या देव पर्यावरण के लिए)

<bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
     p:showSql="false" 
     p:generateDdl="true"/> 

है या वसंत में बनाने आलसी झूठी और डेटाबेस में बनाने के लिए तर्क जोड़ें यदि आपके पास यह नहीं है या आपकी स्क्रिप्ट इंजेक्ट करें, या जो भी आप चाहते हैं।इस प्रकार की तरह

<bean id="someBean" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="someProperty"> 
     ... description of the property 
    </property> 
    <property name="targetMethod" value="methodName" /> 
</bean> 

- -

<bean id="bootstrapStartup" class="com.tscompany.rest.bootstrap.BootstrapStartup" lazy-init="false" init-method="init"/> 
0

आप रूट संदर्भ विन्यास में कुछ सेम बना सकते हैं आवेदन स्टार्टअप विधि "methodName" पर सक्रिय किया जाएगा। हमारे पास डीबी उन्नयन इस तरह से लागू किए गए हैं।

0

आप अपने hibernate.hbm2ddl.auto संपत्ति create या create-drop लिए सबसे आसान तरीका है कि ऐसा करने के लिए निर्धारित किया है तो एसक्यूएल फ़ाइल नाम है कि SQL कथन डेटाबेस स्कीमा में आपकी प्रारंभिक डेटा लोड करने में शामिल है, उदा hibernate.hbm2ddl.import_files संपत्ति की स्थापना द्वारा है प्रारंभिक आवेदन उपयोगकर्ता।

निम्नलिखित उदाहरण है कि मेरे पास DatabaseConfig कक्षा में है। यह SQL फ़ाइल नाम import_initial_data.sql के साथ hibernate.hbm2ddl.import_files संपत्ति सेट करता है जिसमें डेटाबेस स्कीमा में अपना प्रारंभिक डेटा लोड करने के लिए SQL सम्मिलन विवरण शामिल हैं।

@Bean 
    public LocalSessionFactoryBean hibernate5SessionFactoryBean(){ 
     LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean(); 
     localSessionFactoryBean.setDataSource((DataSource) appContext.getBean("DataSource")); 
     localSessionFactoryBean.setAnnotatedClasses(AppUser.class); 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); 
     properties.put("hibernate.hbm2ddl.auto","create-drop"); 
     properties.put("hibernate.hbm2ddl.import_files", "import_initial_data.sql"); 
     properties.put("hibernate.show_sql","true"); 
     localSessionFactoryBean.setHibernateProperties(properties); 
     return localSessionFactoryBean; 
    } 

यह मेरा modelAppUser.java में पैकेज है:

package com.beniregev.model; 

import lombok.AccessLevel; 
import lombok.AllArgsConstructor; 
import lombok.NoArgsConstructor; 
import javax.persistence.*; 

@Entity 
@NoArgsConstructor(access = AccessLevel.PUBLIC) 
@AllArgsConstructor(access = AccessLevel.PUBLIC) 
public class AppUser { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    @Column(nullable = false, unique = true) 
    private String userName; 
    @Column(nullable = false) 
    private String password; 

    public AppUser(String userName, String password) { 
     this.userName = userName; 
     this.password = password; 
    } 
} 
के लिए

Maven निर्भरता lombok:

<dependency> 
    <groupId>org.projectlombok</groupId> 
    <artifactId>lombok</artifactId> 
    <version>1.16.6</version> 
    <scope>provided</scope> 
</dependency> 

import_initial_data.sql फ़ाइल मैं resources निर्देशिका में है:

INSERT INTO appuser(username, password) VALUES ('jesus', 'christ'); 
INSERT INTO appuser(username, password) VALUES ('mary', 'virgin'); 
INSERT INTO appuser(username, password) VALUES ('josef', 'who?'); 
INSERT INTO appuser(username, password) VALUES ('jeremaia', 'profet'); 
COMMIT; 

और * चुनें * appuser से का परिणाम, *:

Resultset of SELECT * FROM appuser;