2014-10-01 7 views
18

मैं ड्रॉपविज़ार्ड के साथ खेल रहा हूं और मैं एक आरईएसटी एप्लीकेशन बनाना चाहता हूं जिसमें इकाइयों में विभिन्न विदेशी-महत्वपूर्ण संबंध हैं।जेडीबीआई आवेषण पर स्वत: उत्पन्न मूल्य लौटा

उदाहरण के लिए

दिया निम्नलिखित 3 टेबल:

-- table persons 
CREATE TABLE PUBLIC.PERSONS(
    ID BIGINT DEFAULT NOT NULL AUTOINCREMENT, 
    FIRST_NAME VARCHAR(255), 
    LAST_NAME VARCHAR(255), 
    BIRTHDAY DATE, 
    ADDRESS_ID BIGINT NOT NULL, 
    CREATED TIMESTAMP DEFAULT 'current_timestamp', 
    MODIFIED TIMESTAMP 
); 
ALTER TABLE PUBLIC.PERSONS ADD CONSTRAINT PUBLIC.PK_PERSONS PRIMARY KEY(ID); 

-- table customers 
CREATE TABLE PUBLIC.CUSTOMERS(
    ID BIGINT DEFAULT NOT NULL AUTOINCREMENT, 
    PERSON_ID BIGINT NOT NULL, 
    STATUS_CODE VARCHAR(100) DEFAULT 'ACQUISITION' NOT NULL, 
    CREATED TIMESTAMP DEFAULT 'current_timestamp', 
    MODIFIED TIMESTAMP 
); 
ALTER TABLE PUBLIC.CUSTOMERS ADD CONSTRAINT PUBLIC.PK_CUSTOMERS PRIMARY KEY(ID); 

-- table addresses 
CREATE TABLE PUBLIC.ADDRESSES(
    ID BIGINT DEFAULT NOT NULL AUTOINCREMENT, 
    LINE_1 VARCHAR(255), 
    LINE_2 VARCHAR(255), 
    ZIP VARCHAR(255), 
    CITY VARCHAR(255), 
    COUNTRY_CODE VARCHAR(3), 
    PHONE VARCHAR(255), 
    FAX VARCHAR(255), 
    CREATED TIMESTAMP DEFAULT 'current_timestamp', 
    MODIFIED TIMESTAMP 
); 
ALTER TABLE PUBLIC.ADDRESSES ADD CONSTRAINT PUBLIC.PK_ADDRESSES PRIMARY KEY(ID); 

-- and following forign key constraints: 
ALTER TABLE PUBLIC.PERSONS ADD CONSTRAINT 
    PUBLIC.FK_PERSON_ADDRESS FOREIGN KEY(ADDRESS_ID) 
    REFERENCES PUBLIC.ADDRESSES(ID) ON DELETE SET NULL NOCHECK; 

ALTER TABLE PUBLIC.CUSTOMERS ADD CONSTRAINT 
    PUBLIC.FK_CUSTOMER_PERSON FOREIGN KEY(PERSON_ID) 
    REFERENCES PUBLIC.PERSONS(ID) ON DELETE SET NULL NOCHECK; 

मैं एक customerDAO है कि ग्राहक की मेज एक dthe संदर्भित एक SQL क्वेरी के साथ टेबल के डेटा पढ़ता है लागू करने के लिए शुरू कर दिया है, कि बहुत जटिल नहीं था:

@RegisterMapper(CustomerResultMapper.class) 
public interface CustomerDAO { 

    @SqlQuery("select p.id as person_id, " 
      + "p.first_name, p.last_name, p.birthday, " 
      + "c.id as customer_id, c.status_code, " 
      + "a.id as address_id, a.line_1, a.line_2, a.zip, " 
      + "a.city, a.country_code, a.phone, a.fax " 
      + "from customers c, persons p, addresses a " 
      + "where c.id = :id " 
      + "and c.person_id = p.id " 
      + "and p.address_id = a.id") 
    public Customer findCustomerById(@Bind("id") long id); 
} 

(संक्षिप्तता के लिए, मैं नक्शाकार को छोड़, के बाद से है कि मेरे वास्तविक सवाल नहीं है)

अब मैं एक नए ग्राहक सम्मिलित करना चाहते हैं, मैं संदर्भित तालिकाओं में मौजूद डेटा समेत सभी आवश्यक डेटा हैं।

मुझे जेडीबी एनोटेशन के साथ कई प्रश्नों को निष्पादित करने का तरीका नहीं मिला, इसलिए मुझे लगा कि मुझे टेबल में से प्रत्येक के लिए एक डीएओ विधि बनाना है और जावा के भीतर से डेटा डालना है, मैन्युअल रूप से विदेशी कुंजी संदर्भों को अपडेट करना ।

लेकिन यह भी काम नहीं करता है क्योंकि मुझे डालने के बाद स्वत: उत्पन्न आईडी मान पढ़ने का कोई तरीका नहीं मिला।

कोई विचार यह है कि मैं इस समस्या से कैसे संपर्क कर सकता हूं ताकि मैं संदर्भों को सही रख सकूं?

उत्तर

31

कोई बात नहीं, मैं इस बीच में समाधान नहीं मिला, कम से कम कैसे प्राप्त करने के लिए स्वत: जनरेट की गई कुंजी:

अपने डीएओ में

, @GetGeneratedKeys टिप्पणी जोड़ने के लिए सुनिश्चित करें कि विधि की अपनी वापसी मान से मेल खाता है जनरेट की गई कुंजी का मूल्य:

long id = customerDAO.insertAddress(); 
System.out.println("Found id " + id); 

यह उत्पन्न ke प्राप्त करने के लिए काम करता है:

@SqlUpdate("insert into addresses (line_1) values ('address line 1')") 
@GetGeneratedKeys 
public long insertAddress(); 

अपने संसाधन में तो, आप बस वापसी मान का उपयोग कर सकते वाई एक बयान के लिए, हालांकि मेरे मामले में, मुझे अभी भी कई प्रश्न पूछने और मैन्युअल रूप से सही संदर्भों को भरने की आवश्यकता है।

क्या किसी को यह पता होना चाहिए कि मैं इस प्रक्रिया को कैसे सरल बना सकता हूं और संदर्भों को स्वचालित रूप से भरने देता हूं, फिर भी मुझे इसके बारे में सुनना होगा।

धन्यवाद।

+0

आप विधि एक सूची वापसी बनाने की कोशिश की है:

आप पता करने के लिए एक नक्शाकार है @SqlQuery को @SqlUpdate बदल रहा है और सम्मिलित करें का उपयोग कर ... * लौटने के बाद यह सोचते हैं द्वारा यह कर सकता है? –

+0

नहीं, जहां तक ​​मैं समझता हूं कि GetGeneratedKeys Annotation मान एसिंट या लंबा देता है, तो आप एक सूची वापस नहीं कर सकते हैं। –

+2

org.skife.jdbi.v2.GeneratedKeys को देखकर, यह काम कर सकता है। कोड java.sql.Statement.getGeneratedKeys() को कॉल करता है जो एक परिणामसेट देता है। कोशिश करो। –

13

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

@SqlQuery("insert into addresses (line_1) values ('address line 1') returning *") 
public Address insertAddress(@BindBean Address address); 
+1

वह कितना भयानक है? – Christian

+1

यह जवाब होना चाहिए। –

+0

बहुत बढ़िया, मेरे काम को आसान बना दिया +1 – BeginnersSake

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