समस्या सिंटैक्स नहीं थी, क्योंकि सिंटैक्स पूरी तरह से फ्लाईवे के साथ या सीधे पोस्टग्रेएसक्यूएल सीएलआई में काम कर रहा था। समस्या हाइबरनेट के साथ थी, विशेष रूप से आयात फ़ाइल को पार्स करने के साथ। हाइबरनेट जिस तरह से काम करता है वह यह है कि यह प्रत्येक अभिव्यक्ति को फाइलों से अलग-अलग निष्पादित करता है, न कि पूरी सामग्री को एक अभिव्यक्ति के रूप में। मैंने सभी फ़ंक्शन परिभाषाओं को एक पंक्ति में रखने की कोशिश की और यह काम कर गया, लेकिन यह पठनीय नहीं था। तो मैंने पाया कि हाइबरनेट के लिए यह बताने के लिए एक कॉन्फ़िगरेशन है कि अभिव्यक्ति बहु-पंक्तिबद्ध हो सकती है, लेकिन $$
बहु-पंक्ति में उपयोग किए जाने पर सीमांकक अभी भी अपरिचित था।
तो समाधान '
. के साथ कमांड को परिभाषित करना था सीमांकक और फिर एक अतिरिक्त '
. के साथ जहां आवश्यक हो एकल उद्धरणों से बचें .
समाधान spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor
सेट करना है org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor
का उपयोग करने के लिए . MultiLinesSqlCommandExtractor SQL एक्सप्रेशन को कई पंक्तियों से निकालता है, और अर्धविराम मौजूद होने पर रुक जाता है। वह अभिव्यक्ति का अंत है। फ़ंक्शन के बॉडी को सिंगल-कोट स्ट्रिंग में लपेटकर, हाइबरनेट उस रैपिंग को सिंगल लाइन के रूप में मानेगा।
data.sql
CREATE OR REPLACE FUNCTION insert_timeout_configuration() RETURNS bigint AS '
DECLARE created_id bigint;
BEGIN
INSERT INTO timeout_configuration (id, version, timeout)
VALUES (nextval(''my_sequence''), 0, 300)
RETURNING id INTO created_id;
return created_id;
END;
' language plpgsql;
CREATE OR REPLACE FUNCTION insert_url_configuration() RETURNS bigint AS '
DECLARE created_id bigint;
BEGIN
INSERT INTO url_configuration (id, version, my_url)
VALUES (nextval(''my_sequence''), 0,''http://localhost:8080/'')
RETURNING id INTO created_id;
return created_id;
END;
' language plpgsql;
DO '
INSERT INTO global_configuration(id, version, name, timeout_configuration_id, url_configuration_id)
VALUES (nextval(''my_sequence''), 0, ''My global config'', insert_timeout_configuration(), insert_url_configuration());
-- do some other code
END
';
drop function insert_timeout_configuration();
drop function insert_url_configuration();
मुझे भावों में एकल-उद्धरणों से बचने के लिए हमेशा ध्यान रखना होगा, लेकिन अब मेरे पास अधिक मानव-पठनीय बीज फ़ाइल हो सकती है।