2012-10-02 22 views
9

तीन टेबल तीन संस्थाओं के रूप में मॉडलिंग की हैं:जेपीए 3-जिस तरह से व्याख्या में शामिल होने

@Entity 
@Table(name="event") 
public class Event { 
    public Long datetime; 
    public String name; 
    public Long processId; 
} 

@Entity 
@Table(name="process") 
public class Process { 
    public Long Id; 
    public Long sequence; 
    public Name name; 
} 

@Entity 
@Table(name="operation") 
public class Operation { 
    public Long Id; 
    public Long datetime; 
    public Long sequence; 
} 

प्रक्रिया आपरेशन-अनुक्रम का कोई भी अद्वितीय एकल रिकॉर्ड एसक्यूएल की कोई समस्या 3-जिस तरह से शामिल होने के है के द्वारा प्राप्त किया जाता है:

SELECT * 
FROM event e, process p, operation q 
WHERE e.processId = p.id 
    AND e.datetime = q.datetime 
    AND p.sequence = q.sequence 

कि लागू करने के लिए जेपीए में, मैं आपरेशन के,

एक सूची है जो स्पष्ट रूप JQPL समानता p.sequence अपरोक्ष एक भी रिकॉर्ड तक ही सीमित हो जाएगा = q.sequence करना है

JPQL कहाँ निर्दिष्ट करता सकर्मक 3 बाधा में शामिल होने:

SELECT e FROM Event e 
INNER JOIN FETCH e.process p 
INNER JOIN FETCH e.operations q 
WHERE p.sequence = q.sequence 

हालांकि, मैं सभी तीन की कमी इकाई POJO अंदर तैयार किया जा करना चाहते हैं। अकेले जेपीए एनोटेशन का इस्तेमाल तीन तरह से जुड़ने के लिए नहीं किया जाना चाहिए? निम्नलिखित इकाई छद्म कोड दिखाता है के रूप में:

@Entity 
@Table(name="event") 
public class Event { 
    public Long datetime; 
    public String name; 
    public Long processId; 
    @OneToOne 
    @JoinColumn(
    name = "processId", referencedColumnName="id", 
    insertable=false, updatable=false) 
    private Process process; 

    @OneToOne 
    @JoinColumn(
    name = "datetime", referencedColumnName="datetime", 
    insertable=false, updatable=false) 
    @JoinColumn(
    name = "process.sequence", referencedColumnName="sequence", 
    insertable=false, updatable=false) 
    private Operation operations; 
} 

तो यह है कि यह निर्दिष्ट करना आवश्यक नहीं होगा JPQL

SELECT e FROM Event e 
INNER JOIN FETCH e.process p 
INNER JOIN FETCH e.operations q 

में बाधा सकर्मक-में शामिल होने मैं एक सकर्मक कैसे मॉडल जेपीए एनोटेशन का उपयोग शामिल होते हैं?

+0

Btw, मैं बाहर छोड़ दिया है JAXB एनोटेशन। ईवेंट पूरी तरह से एक्सएमएल रूट टैग होना चाहिए। इसलिए, इवेंट POJO का उपयोग करके इकाई का मॉडल किया जा रहा है। इवेंट इकाई का उपयोग सीधे एक्सएमएल डीटीओ थ्रो जेएक्सबी के रूप में किया जाता है। यही कहना है, आपको यह सुझाव नहीं देना चाहिए कि मैं रूट के रूप में एक और POJO का उपयोग करता हूं। –

+0

मैं आपकी समस्या के बारे में 100% निश्चित नहीं हूं ... यदि आप जुड़ने के ऑन क्लॉज को निर्दिष्ट करते हैं, तो क्या यह आपकी समस्या का समाधान नहीं करता है? – slambeth

उत्तर

2

आप अपने डेटा की बजाय एक प्रश्न मॉडल करने का प्रयास कर रहे हैं। आपको अपने डेटा को सही तरीके से मॉडल करना चाहिए, फिर अपनी क्वेरी लिखें। OneToMany-

आप

घटना

  • प्रक्रिया
  • ManyToOne (ProcessID) के लिए

प्रक्रिया

  • घटनाओं लगते हैं
  • संचालन - OneToMany

ऑपरेशन

  • प्रक्रिया - ManyToOne (अनुक्रम) (यह एक, के रूप में अनुक्रम आईडी नहीं है, एक छोटे से अजीब है इस जेपीए कल्पना के बाहर है, लेकिन कुछ जेपीए प्रदाता यह समर्थन कर सकते हैं)

एक घटना के लिए सभी कार्यों को क्वेरी करने के लिए, आप इस्तेमाल कर सकते हैं,

Select o from Operation o join o.process p join p.events e where e.datetime = o.datetime 

सभी वस्तु वापस पाने के लिए उपयोग करते हैं,

Select o, p, e from Operation o join o.process p join p.events e where e.datetime = o.datetime 

तुम सच में एक रिश्ते के रूप में क्वेरी मॉडल करने के लिए की जरूरत है, इस जेपीए कल्पना के बाहर है, लेकिन कुछ जेपीए प्रदाताओं इसे समर्थन कर सकते हैं। EclipseLink में आप किसी भी अभिव्यक्ति मानदंडों का उपयोग करने के लिए किसी भी रिश्ते को कॉन्फ़िगर करने के लिए एक वर्णनकर्ता ग्राहक का उपयोग कर सकते हैं, या आप SQL के स्वामी हैं।

+4

कृपया मेरी माफ़ी स्वीकार करें - लेकिन क्या आप मेरे प्रश्न का उत्तर देने के बजाय मेरे प्रश्न का उत्तर दे सकते हैं, मुझे सलाह देकर कि मलबे के लोगों को मेरे जीवन में कैसे फेंकना है? धन्यवाद। –

1

आपका छद्म मैपिंग लगभग सही समाधान कर रहे हैं, तो आप सिर्फ एक @JoinColumns में समूह दो @JoinColumn रों की जरूरत है:

@OneToOne 
@JoinColumns({ 
    @JoinColumn(
    name = "datetime", referencedColumnName="datetime", 
    insertable=false, updatable=false), 
    @JoinColumn(
    name = "sequence", referencedColumnName="sequence", 
    insertable=false, updatable=false) 
}) 
private Operation operations; 

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

  • कोई संबंधित समस्या नहीं^_^