2009-09-15 14 views
9

समस्या

से MappedSuperclass का चयन मैं एक @MappedSuperclass डाटा मेरी डेटाबेस में हर इकाई के माता पिता के रूप कहा जाता है। इसमें आईडी आदि जैसे सामान्य गुण शामिल हैं। उसके बाद एक ऐसी इकाई है जो डेटा को बढ़ाती है जो इसके उप-वर्गों की सामान्य कार्यक्षमता के कारण @MappedSuperclass भी है। मेरे डेटाबेस में मैपिंग सही है।डेटाबेस (हाइबरनेट)

यहाँ मेरी पदानुक्रम

 
@MappedSuperclass 
Data 
| @MappedSuperclass 
+- Employee 
|  | @Entity 
|  +- FullTimeEmployee 
|  | @Entity 
|  +- PartTimeEmployee 
| @Entity 
+- Store 

का एक उदाहरण है और टेबल सही ढंग से मैप की जाती हैं:

 
FullTimeEmployee 
PartTimeEmployee 
Store 

वहाँ वैसे भी सभी कर्मचारी उपवर्गों (FullTimeEmployee, PartTimeEmployee) उदाहरणों के रूप में के लिए डेटाबेस क्वेरी करने के लिए है क्वेरी में उप-वर्गों के नाम का जिक्र किए बिना कर्मचारी का?

कुछ

तरह
List<Employee> allEmployees = getAllEmployees(); 

विचार मैं क्वेरी को बदलने के लिए नाम शामिल करने के लिए नहीं होगा जब भी मैं कर्मचारी (अर्थात AllDayEmployee) का एक और उपवर्ग बनाने का निर्णय लेते हैं।


समाधान

तो, के रूप में Gregory सही ढंग से कहा, यह संभव @MappedSuperclass के साथ है। इसलिए मैंने इसे @Entity में बदल दिया और, क्योंकि मैं प्रत्येक सबक्लास के लिए एक टेबल को संरक्षित करना चाहता था, मैंने InheritanceType.JOINED का उपयोग किया था।

तो ऊपर पदानुक्रम अब

 
@MappedSuperclass 
Data 
| @Entity 
| @Inheritance(strategy=InheritanceType.JOINED) 
+- Employee 
|  | @Entity 
|  +- FullTimeEmployee 
|  | @Entity 
|  +- PartTimeEmployee 
| @Entity 
+- Store 

है और टेबल अभी भी कर रहे हैं: सभी कर्मचारियों को पाने के लिए तो अब

 
FullTimeEmployee 
PartTimeEmployee 
Store 

, मैं बस फोन:

entityManager.createQuery("from Employee").getResultList(); 
+0

क्या होगा यदि मैं FullTimeEmployee और PartTimeEmployee (मैं ओरेकल उपयोग कर रहा हूँ के लिए दो अलग-अलग '@ SequenceGenerator' की जरूरत दृश्यों)? एक संस्था होने के नाते मुझे कर्मचारी वर्ग पर '@ आईडी' निर्दिष्ट करना होगा। – drakyoko

उत्तर

8

नहीं, तुम @MappedSuperclass

इस का कारण यह है जब आप @MappedSuperclass के रूप में आधार वर्ग को परिभाषित, है कि वहाँ कोई तालिका आधार वर्ग के लिए उत्पन्न, बजाय सभी गुणों की ठोस में दोहराया जाता है है प्रयोग कर रहे हैं टेबल। आपके उदाहरण में केवल फुलटाइम कर्मचारी, पार्टटाइम कर्मचारी और स्टोर टेबल मौजूद होंगे।

यदि आप बेस क्लास इकाइयों के लिए पूछताछ करने में सक्षम होना चाहते हैं तो आपको बेस क्लास के लिए अलग मैपिंग का चयन करना होगा। बेस क्लास पर @ विरासत एनोटेशन का उपयोग करें और 3 संभावित मैपिंग रणनीतियों में से एक का चयन करें - सिंगल टेबल, टैब प्रति क्लास या जॉइन

0

हाँ

FROM Employee WHERE Employee.<employee only properties> = someValue 

लेकिन केवल, जैसा कि अन्य ने यहां कहा है, यदि कर्मचारी इकाई मैप की गई है। आपको इसे अपनी 'टेबल पर भी मैप करने की आवश्यकता नहीं है। हाइबरनेट में मैपिंग रणनीतियों को देखें।

+0

+1 हां। हाइबरनेट में, आप एक अमूर्त वर्ग के लिए चयन कर सकते हैं, आपको सभी सबक्लास भी मिलेंगे। दिया गया उदाहरण ऑब्जेक्ट के लिए क्वेरी करना है, जो पूरे डेटाबेस को वापस कर देगा! :-) – KLE

+0

यह देखते हुए कि कर्मचारी एक अमूर्त वर्ग है जिसमें @MappedSuperclass एनोटेशन है, मैं कर्मचारी के सभी सबक्लास उदाहरण प्राप्त करना चाहता हूं। "कर्मचारी से" क्वेरी एक क्वेरीस सिंटेक्स एक्सेप्शन फेंकता है: कर्मचारी को मैप नहीं किया गया है " – pek

+0

कृपया मेरा जवाब देखें कि यह @MappedSuperclass –

0

मुझे लगता है कि यह ऐसा करने में सक्षम है (हालांकि इनहेरिटेंस टाइप। जॉइनड का उपयोग करके) हाइबरनेट 5.0.8 के साथ , जावा 1.8.0_73 और ओरेकल 12 सी - या तो मैं गलतफहमी कर रहा हूं या शायद हाइबरनेट बदल गया है ..

मैं निम्नलिखित hierarhcy है:

@MappedSuperclass 
@Inheritance(strategy=InheritanceType.JOINED) 
CommonRoot 
| 
| @MappedSuperclass 
+- Mapped 
     | @Entity(name="Concrete1") 
     | @Table(name="CON1") 
     +- Concrete1 
     | 
     | @Entity(name="Concrete2") 
     | @Table(name="CON2") 
     +- Concrete2 

और मैं निम्नलिखित HQL कर सकते हैं:

SELECT entityId FROM com.hibernatetest.Mapped ORDER BY entityId ASC 

जो इन 2 SQL कथन देता है:

select concrete2x0_.entityId as col_0_0_ from CON2 concrete2x0_ order by concrete2x0_.entityId ASC 
select concrete1x0_.entityId as col_0_0_ from CON1 concrete1x0_ order by concrete1x0_.entityId ASC 

और चेतावनी

WARN: HHH000180: FirstResult/maxResults specified on polymorphic query; applying in memory! 

सुनिश्चित नहीं हैं कि क्या वे हालांकि मतलब है, के रूप में इस के रूप में एसक्यूएल के साथ किया जा सकता है:

(select entityId from CON2 
union all 
select entityId from CON1) 
order by entityId ASC 

(और तुम भी अगर तुम, इच्छा हालांकि कि थोड़ा भद्दा हो जाता है कि करने के लिए सीमा/ROWNUM खंड जोड़ सकते हैं:

select * from (
(select * from (select entityId from CON2 order by entityId ASC) where rownum <= 10) 
UNION ALL 
(select * from (select entityId from CON1 order by entityId ASC) where rownum <= 10) 
) where rownum <= 10 order by entityId ASC 

सुनिश्चित नहीं हैं कि क्यों हाइबरनेट यह करने के लिए सक्षम नहीं होना चाहिए -। यह उनके लिए सुझाव दे सकता है)

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