2011-02-11 6 views
9

मैं निम्नलिखित कोडइकाई प्रबंधक का उपयोग कर क्वेरी का उपयोग कर डेटाबेस में मूल्यों को कैसे सम्मिलित करें, जावा क्लास का उपयोग करके दृढ़ता?

public User registerUser(String usr, String pwd) { 

    u=em.find(User.class,usr); 
    if(u!=null) 
    { 
     return null; 
    } 
    String query1 = "insert into users values('" + usr + "','" + pwd +"')"; 
    Query q = em.createQuery(query1); 
    u=em.find(User.class,usr); 
    return u; 

}

यहाँ 'u

का उपयोग कर एक तालिका में डेटा सम्मिलित करना चाहते हैं 'User वर्ग की वस्तु है और emEntityManager है।

मैं इस निम्न अपवाद प्राप्त करें:

Servlet.service() सर्वलेट कार्रवाई के लिए फेंक दिया अपवाद org.hibernate.hql.ast.QuerySyntaxException: उम्मीद खुली मिला, 'मूल्यों' के पास लाइन 1, स्तंभ 19 [उपयोगकर्ताओं के मूल्यों में डालें ('पावन', 'एम')]

उत्तर

15

public User registerUser(String usr, String pwd) { 

    u=em.find(User.class,usr); 
    if(u!=null) 
    { 
     return null; 
    } 

    //Now saving... 
    em.getTransaction().begin(); 
    em.persist(u); //em.merge(u); for updates 
    em.getTransaction().commit(); 
    em.close(); 

    return u; 
} 

का प्रयास करें (पी पहचान है, यह है, अपने मौजूदा वर्ग में स्वचालित रूप से स्थापित किया जाएगा यदि आप ऑटो पीढ़ी रणनीति उपयोग कर रहे हैं डेविड विक्टर के लिए धन्यवाद)। टिप्पणी @aman_novice

संपादित करने के लिए: अपनी कक्षा

//Do this BEFORE getTransaction/persist/commit 
//Set names are just a example, change it to your class setters 
u.setUsr(usr); 
u.setPwd(pwd); 

//Now you can persist or merge it, as i said in the first example 
em.getTransaction().begin(); 
(...) 

@ दाऊद विक्टर बारे में यह निर्धारित करते हैं, माफ करना मैं उस बारे में भूल गया।

+0

यूएसआर के साथ उपयोगकर्ता तालिका में यह कैसे सम्मिलित होगा ?? –

+0

पीके केवल पीढ़ी की रणनीति के आधार पर सेट किया जाएगा। यानी @GeneratedValue (strategy = GenerationType.AUTO) एनोटेशन या इसी तरह की। आमतौर पर घोषणात्मक टीएक्सएन सीमाओं पर भरोसा करना बेहतर होता है। –

0

यह वास्तव में जाने का तरीका नहीं है। आप एक तालिका में एक पंक्ति डालने की कोशिश कर रहे हैं लेकिन कोई संलग्न संलग्न इकाई नहीं है। यदि आप जेपीए इकाई प्रबंधक का उपयोग कर रहे हैं - तो एक नया उदाहरण बनाएं - गुण & सेट करें इकाई को बनाए रखें।

उदा।

User u = new User(); 
u.setXXX(xx); 

em.persist(u); 
// em.flush() <<-- Not required, useful for seeing what is happening 

// etc.. 

आप & इकाई फ्लश तो आप देखेंगे कि क्या डेटाबेस के लिए भेज दिया जाता है हाइबरनेट में एसक्यूएल loggging सक्षम करते हैं।

उदा। persistence.xml में:

<property name="hibernate.format_sql" value="true" /> 
5

आप एसक्यूएल उपयोग नहीं कर रहे लेकिन JPAQL, वहाँ कोई क्षेत्र के आधार पर डालने है। पंक्तियों को डालने के बजाए आप ऑब्जेक्ट बनाते हैं।

आप कुछ इस तरह करना चाहिए:

public User registerUser(String usr, String pwd) { 
    u=em.find(User.class,usr); 
    if(u!=null) 
    { 
     return u; 
    } 
    u = new User(usr, pwd); 
    em.persist(u); 
    return u; 
} 
+0

या सच ... मेरा बुरा .. इसे एसक्यूएल के रूप में लिखें। हालांकि, मैं यह इंगित करना चाहता हूं कि उपयोगकर्ता() एक पैरामीटर कन्स्ट्रक्टर है। तो मैं उस वस्तु को नहीं बना सकता !!! :( –

+0

@aman_novice: ठीक है, फिर उपयोगकर्ता नाम और पासवर्ड सेट करने के लिए सेटटर विधियों का उपयोग करें। –

+0

मुझे लगता है कि उपयोगकर्ता वर्ग के पहचानकर्ता के प्रकार के साथ यहां कोई समस्या होगी। आईडी प्रकार को स्ट्रिंग पर सुनिश्चित करना आवश्यक है इकाई। जो काम करेगी - लेकिन असामान्य है। :-) –

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