2017-03-10 26 views
5

के तहत एच 2 निष्पादित करना मैंने वसंत प्रारंभकर्ता, एम्बेडेड टोमकैट, थाइमेलीफ टेम्पलेट इंजन, और पैकेज निष्पादन योग्य JAR फ़ाइल के रूप में एक स्प्रिंग बूट वेब एप्लिकेशन जेनरेट किया है।स्प्रिंग बूट

टेक्नोलॉजीज का प्रयोग किया:

स्प्रिंग बूट 1.4.2.RELEASE, स्प्रिंग 4.3.4.RELEASE, Thymeleaf 2.1.5.RELEASE, बिलाव एम्बेड 8.5.6, Maven 3, जावा 8

यह वह जगह है एक सेम मैं फोन डीबी

@SpringBootApplication 
@EnableAutoConfiguration 
@Import({SecurityConfig.class}) 
public class BookApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(BookApplication.class, args); 
    } 
} 



@Configuration 
public class PersistenceConfig { 

... 

    /** 
     * Creates an in-memory "books" database populated 
     * with test data for fast testing 
     */ 
     @Bean 
     public DataSource dataSource(){ 
      return 
       (new EmbeddedDatabaseBuilder()) 
       .addScript("classpath:db/H2.schema.sql") 
       .addScript("classpath:db/H2.data.sql") 
       .build(); 
     } 

प्रारंभ करने वाले जब मैं

CREATE TABLE IF NOT EXISTS t_time_lapse (
     id   bigint PRIMARY KEY, 
     name  varchar(50) NOT NULL, 
     description varchar(200) NOT NULL, 
     sunday  boolean DEFAULT NULL, 
     monday  boolean DEFAULT NULL, 
     tuesday  boolean DEFAULT NULL, 
     wednesday boolean DEFAULT NULL, 
     thursday boolean DEFAULT NULL, 
     friday  boolean DEFAULT NULL, 
     saturday boolean DEFAULT NULL, 
     init_period date NOT NULL , 
     end_period date NOT NULL , 
     init_time time DEFAULT NULL, 
     end_time time DEFAULT NULL, 
     company_id bigint DEFAULT NULL, 
     FOREIGN KEY (company_id)  REFERENCES public.t_company(id) 
); 



insert into T_TIME_LAPSE (ID, NAME, DESCRIPTION, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, INIT_PERIOD, END_PERIOD, INIT_TIME, END_TIME, COMPANY_ID) 
    values (9090,'key', 'key', 1,1,1,1,1,1,1,CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), 1); 

में मैं जी इस डालने पर अमल डेटा स्रोत एक्सप्लोरर में एक ही क्वेरी निष्पादित इस त्रुटि

user lacks privilege or object not found: PARSEDATETIME 

ओ.टी. -> डेटाबेस कनेक्शन -> एसक्यूएल स्क्रैपबुक सब कुछ ठीक है!

लिपि में SHOW CREATE FUNCTION PARSEDATETIME जोड़ने:

Failed to execute SQL script statement #1 of class path resource [db/H2.data.sql]: SHOW CREATE FUNCTION PARSEDATETIME; nested exception is java.sql.SQLSyntaxErrorException: unexpected token: SHOW 

और CREATE FUNCTION PARSEDATETIME;

Failed to execute SQL script statement #1 of class path resource [db/H2.data.sql]: CREATE FUNCTION PARSEDATETIME; nested exception is java.sql.SQLSyntaxErrorException: unexpected end of statement: required: (

और प्रस्तावित उदाहरण के साथ:

Failed to execute SQL script statement #2 of class path resource [db/H2.data.sql]: INSERT INTO test values (1, CALL PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT')); nested exception is java.sql.SQLSyntaxErrorException: unexpected token: CALL 
+0

https://gitter.im/spring-projects/spring-boot पर पूछें और उत्तर – rajadilipkolli

+0

अपडेट करें इसके अलावा: क्या कोई विशेष कारण है कि आप autoconfig का उपयोग क्यों नहीं करते? – Marged

+0

क्या आपका मतलब EnableAuto कॉन्फ़िगरेशन है? –

उत्तर

1

मैंने spring-boot-starter-data-jpa और h2 निर्भरताओं के साथ स्क्रैच बूट प्रोजेक्ट को स्क्रैच से बनाकर अपनी समस्या को पुन: उत्पन्न करने का प्रयास किया।

1) क्रम बना सकते हैं और तदनुसार डेटाबेस को पॉप्युलेट करने में schema.sql और data.sql नाम के साथ /resources में अपनी स्क्रिप्ट कॉल का समय: मैं दो बातें किया था। डिफ़ॉल्ट रूप से स्प्रिंग बूट उन स्थानों से एसक्यूएल लोड करेगा जैसा कि here वर्णित है।

2) मैं इस तरह application.properties में testdb एच 2 डेटाबेस कॉन्फ़िगर किया है:

# H2 database configuration 
spring.datasource.url = jdbc:h2:file:~/testdb;DB_CLOSE_ON_EXIT=FALSE 

# Enable SQL script scanning in /resources folder 
spring.jpa.hibernate.ddl-auto=none 

# Enable H2 console under http://localhost:8080/console/ for dev purposes 
spring.h2.console.enabled=true 
spring.h2.console.path=/console/ 

नतीजा यह है कि एच 2 डेटाबेस नमूना डेटा आप किसी भी त्रुटि बिना प्रदान की आबादी है (मैं कॉन्फ़िगर नहीं किया DataSource जैसा आपने PersistenceConfig में किया था और कुछ और नहीं/कुछ भी नहीं)।

यदि आप कस्टम एसक्यूएल स्क्रिप्ट स्थान पर चिपकना चाहते हैं, तो इस उत्तर https://stackoverflow.com/a/41644743/2402959 के बाद अपने DataSource को कॉन्फ़िगर करने पर विचार करें।

1

किसी कारण से, संग्रहित समारोह PARSEDATETIME की स्थापना मरने से आपको इसका उपयोग करने की इजाजत नहीं है। कृपया SHOW CREATE FUNCTION PARSEDATETIME प्रदान करें। और वसंत की चीजों के माध्यम से देखो।

या, अधिक संभावना है, PARSEDATETIME एक जावा फ़ंक्शन है, न कि MySQL फ़ंक्शन।

नोट: वह स्थान जहां आप इसका उपयोग कर रहे हैं, इसका तात्पर्य है कि यह एक MySQL फ़ंक्शन है। इसे जावा फ़ंक्शन के रूप में उपयोग करने के लिए आपको INSERT में 'बाध्य' करने की आवश्यकता है।

1

आप

insert into T_TIME_LAPSE (ID, NAME, DESCRIPTION, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, INIT_PERIOD, END_PERIOD, INIT_TIME, END_TIME, COMPANY_ID) 
values (9090,'key', 'key', 1,1,1,1,1,1,1,CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CALL PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), CALL PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), 1); 

को

insert into T_TIME_LAPSE (ID, NAME, DESCRIPTION, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, INIT_PERIOD, END_PERIOD, INIT_TIME, END_TIME, COMPANY_ID) 
values (9090,'key', 'key', 1,1,1,1,1,1,1,CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), PARSEDATETIME('03:05:06 GMT','HH:mm:ss z', 'en', 'GMT'), 1); 

से अपने डालने बयान बदलने का प्रयास किया?

+0

हाँ, मैंने कोशिश की :-( –

+0

@Liping huang के रूप में सुझाव दिया गया है कि आप अपनी पोस्ट में अपनी स्कीमा स्क्रिप्ट (H2.schema.sql) के भीतर मौजूद डीडीएल सामग्री को जोड़ सकते हैं? धन्यवाद। –