2013-08-19 12 views
15

के साथ एकाधिक डेटाबेस मेरे पास 2 डेटाबेस हैं जिन्हें मुझे कनेक्ट करने की आवश्यकता है। मैं आसानी से तो जैसे application.conf फ़ाइल में उन्हें करने के लिए कनेक्ट कर सकते हैं:प्ले फ्रेमवर्क 2.1.x

db.default.driver=org.postgresql.Driver 
db.default.url="jdbc:postgresql://localhost/db1" 
db.default.user=postgres 
db.default.password="password" 

db.secondary.driver=org.postgresql.Driver 
db.secondary.url="jdbc:postgresql://localhost/db2" 
db.secondary.user=postgres 
db.secondary.password="password" 

ebean.default="models.db1.*" 
ebean.secondary="models.db2.*" 

मैं उन संकुल में अपने मॉडल श्रेणियां होती हैं, और यह DDL ठीक से तालिकाओं उत्पन्न करता है।

समस्या वास्तव में इन इकाइयों के साथ काम करने में निहित है।

List<Users> users = Users.find.all(); 

यह इस फेंकता है: "डिफ़ॉल्ट" पैकेज में नहीं कुछ भी (एक उदाहरण के रूप माध्यमिक डेटाबेस में उपयोगकर्ता तालिका का उपयोग कर) इस त्रुटि

अगर मैं तालिका की सभी पंक्तियों क्वेरी करने के लिए कोशिश फेंकता त्रुटि:

[PersistenceException: models.db2.Users is NOT an Entity Bean registered with this server?] 

हालांकि मैं 100% यकीन है कि उपयोगकर्ता तालिका बैकएंड में वहाँ है कर रहा हूँ, यह एक पंजीकृत तालिका DDL काम करता है और इस तालिका को ठीक से बनाता है, और मैं उचित वर्गों का आयात कर रहा हूँ।

क्या कोई निश्चित तरीका है कि मुझे मॉडल क्लास से पूछने की ज़रूरत है जो डिफ़ॉल्ट पैकेज में नहीं हैं?

संपादित करें: मुझे एहसास है कि स्टैक ट्रेस दिखाता है कि यह डिफ़ॉल्ट सर्वर का उपयोग करने का प्रयास कर रहा है। मैं इसे द्वितीयक सर्वर का उपयोग कैसे कर सकता हूं?

at com.avaje.ebeaninternal.server.core.DefaultServer.createQuery(DefaultServer.java:989) ~[avaje-ebeanorm-server.jar:na] 
    at com.avaje.ebeaninternal.server.core.DefaultServer.createQuery(DefaultServer.java:946) ~[avaje-ebeanorm-server.jar:na] 
    at com.avaje.ebeaninternal.server.core.DefaultServer.find(DefaultServer.java:982) ~[avaje-ebeanorm-server.jar:na] 
    at play.db.ebean.Model$Finder.all(Model.java:254) ~[play-java-ebean_2.10.jar:2.1.3] 
+0

किसी ने अभी तक आपके प्रश्न का उत्तर नहीं दिया है, इसलिए मुझे लगता है कि आपके प्रश्न में 'संपादित करें' को जोड़ने के बजाय, आपको वास्तव में यह पूछने के लिए संपादित करना चाहिए कि आपको वास्तव में क्या चाहिए। –

+0

models.db2 का उपयोग करने के बजाय। * Application.conf में, models.db2.Users डालने का प्रयास करें। – Franz

+0

@ ग्रेगकोफ, मैंने केवल EDIT कहा क्योंकि मुझे यकीन नहीं था कि अगर कोई प्रश्न संपादित करता है तो कोई जवाब दे रहा था। –

उत्तर

7

ठीक है, आपका application.conf सही प्रतीत होता है।

आप इस तरह माध्यमिक सर्वर का उपयोग हो सकता है:

EbeanServer secondary = Ebean.getServer("secondary"); 
secondary.find(User.class).findList(); 

बार जब आप अपने द्वितीयक सर्वर मिल गया है, तो आप इसे इलाज कर सकते हैं आप Ebean सिंगलटन का इलाज बस के रूप में।

+0

हाँ मैंने इस दृष्टिकोण की कोशिश की है, लेकिन फिर समस्या केवल डेटा के लिए चयन करने के अलावा कुछ भी करने में आती है। उदाहरण के लिए, इस विधि के साथ, मैं सभी उपयोगकर्ताओं को प्राप्त कर सकता हूं, लेकिन उपयोगकर्ताओं के पास एक और वर्ग, "समूह" के साथ एक बहुत ही रिश्ते है। समूह द्वितीयक डेटाबेस में भी है। दृश्य में, मैं प्रत्येक उपयोगकर्ता के लिए सभी समूहों पर नक्शा बनाना चाहता हूं, इसलिए मेरे पास ' @ user.groups.map {group => group.name}' है, फिर भी यह त्रुटि फेंकता है: '[PersistenceException : क्वेरी ने SQLException को फेंक दिया: त्रुटि: कॉलम t1.users_id मौजूद नहीं है ... 'भले ही वह कॉलम मौजूद हो। –

6

मुझे एक ही समस्या थी और मैंने मॉडल पर सर्वर नाम निर्दिष्ट करके इसे ठीक किया। फाइंडर स्तर।

public static Model.Finder<Long, User> find = new Finder<Long, User>("secondary", Long.class, User.class); 
+0

वाह, यह वही है जो मैं ढूंढ रहा हूं, दुर्भाग्यवश यह केवल इस मॉडल से पूछताछ करने वाली किसी चीज़ के लिए काम करता है, लेकिन जब भी मैं इस दृष्टिकोण के लिए एक सेव कमांड का उपयोग करता हूं, तो मुझे त्रुटि मिलती है 'प्रकार ____ एक पंजीकृत इकाई नहीं है? यदि आप ईबीन का उपयोग करने के लिए इकाई वर्गों को स्पष्ट रूप से सूचीबद्ध नहीं करते हैं तो उन्हें कक्षा के लिए खोजा जाएगा। 'क्या आपके पास इसे ठीक करने के तरीके पर कोई विचार है? (हाँ, मुझे पता है कि मेरे मॉडल ठीक से पहले से बनाए गए हैं)। –

+0

क्षमा करें, मुझे यह नहीं मिला। आप अपनी वस्तुओं को बचाने की कोशिश कैसे करते हैं? मैं 'उपयोगकर्ता उपयोगकर्ता = User.find.byId (एआईडी) करता हूं; user.update (सहायता); user.delete(); 'यह ठीक काम करता है, सामान्य ... – DrMabulle

+1

ध्यान रखें कि आपको ईबेन सेविंग विधि को सर्वर को बताने की भी आवश्यकता है! 'सार्वजनिक शून्य सहेजें (स्ट्रिंग सर्वर) '। डिफ़ॉल्ट विधि 'save() 'का उपयोग न करें। – myborobudur

4

आप उपयोग कर सकते हैं दोनों:

तो आपके मामले में, अपने प्रयोक्ता कक्षा में, आप की तरह कुछ करना चाहिए था

public static Model.Finder<Long, User> find = new Finder<Long, User>("secondary", Long.class, User.class); 

और

Ebean.getServer("secondary"); 

लेकिन आपके पास अपनी इकाई

पर सर्वर घोषणा के साथ सहेजने विधि का उपयोग करने के लिए
public void save(String server) 

save() बिना ईबेन आपके उपयोगकर्ता-इकाई पर भी डिफ़ॉल्ट सर्वर का उपयोग करता है!

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