2012-10-17 15 views
5

मेरे पास एक सिंगलटन है जो डेटाबेस में बने रहना है। अन्य निरंतर संस्थाओं को इस सिंगलटन का संदर्भ होना चाहिए। हाइबरनेट के साथ इसे कैसे प्राप्त किया जा सकता है?हाइबरनेट/दृढ़ता और सिंगलटन पैटर्न

मैं कुछ इस तरह नहीं अभी तक काम करना, सिंगलटन के एकल आईडी faking के साथ खत्म हुआ:

@Entity 
@Subselect("select '1' as ID") 
class Singleton { 
    @Id 
    @Column(name="ID") 
    private Long getId() { return 1l; } 
    private void setId(Long id) { } 
} 

@Entity 
@Table(name="ENT") 
class MyEnt { 
    // TODO: how to annotate so that table ENT doesn't need foreign key column 
    Singleton s; 
} 

समस्या यह है कि मैं संस्थाओं में विदेशी कुंजी संदर्भित के साथ एक स्तंभ है नहीं करना चाहती है सिंगलटन - क्योंकि सिंगलटन केवल एक है और हमें इसकी आईडी की आवश्यकता नहीं है ...

शायद मैं गलत तरीके से सोच रहा हूं? शायद यह गलत वास्तुकला मुद्दा है? क्या आपने इसी तरह के मुद्दे को हल किया?

उत्तर

0

यदि Singleton केवल एक वस्तु है, तो आप इसे अन्य संस्थाओं में क्यों मैप करना चाहते हैं?

आप एक बार Singleton लोड करना और application context पर डाल सकते हैं। उस स्थिति में, जब भी आपको इसकी आवश्यकता हो, आप इसका पुन: उपयोग कर सकते हैं।

+0

हाँ लेकिन क्या अगर आप कंटेनर को पुनः आरंभ करने की जरूरत है या आप कई कंटेनरों है? सिंगलटन की वर्तमान स्थिति को कैसे बचाएं? या इसे सभी कंटेनरों में बदल दें? – ElderMael

+0

मेरा मतलब उस वस्तु को डिजाइन किए गए तरीके से था। मैं बस इतना कह रहा हूं कि मुझे अन्य संस्थाओं में इसका मानचित्रण करने का कोई कारण नहीं दिख रहा है। ऑब्जेक्ट को एक बार लोड करें और ऐप संदर्भ में रखें। यदि आप कंटेनर को पुनरारंभ करना चाहते हैं, तो इसे फिर से लोड करें। –

+0

1. क्योंकि डेटा डेटाबेस में बदल सकता है (वेबपैप अधिक नोड्स पर है) 2. क्योंकि इकाई को अपने व्यापार तर्क विधियों में सिंगलटन की आवश्यकता होती है। और मैं इसे "मैन्युअल रूप से" में नहीं रखना चाहता हूं। यह डीएओ सेवा द्वारा इस डीएओ सेवा द्वारा लोड की गई संस्थाओं के लिए किया जा सकता है, लेकिन संस्थाओं के साथ क्या करना है, जो अप्रत्यक्ष रूप से लोड हो जाते हैं (मूल इकाई द्वारा संदर्भित)? – Jakub

1

मैं इस के साथ खत्म हुआ:

@Entity 
@Subselect("select '1' as ID, * from TABLE") 
class Singleton { 
    @Id 
    @Column(name="ID") 
    private Long getId() { return 1l; } 
    private void setId(Long id) { } 
    // ... other useful fields persisted in TABLE 
} 

@Entity 
@Table(name="ENT") 
class MyEnt implements Lifecycle { 
    Singleton s; 
    void onLoad(Session sess, Serializable id) { 
     this.s = sess.get(Singleton.class, 1l); 
    } 
    // etc... 
}