2012-07-12 10 views
13

मैं अपनी संस्थाओं का ऑडिट करने के लिए हाइबरनेट एनवर्र्स का उपयोग करता हूं।हाइबरनेट Envers का उपयोग कर एक जॉइन टेबल और संबंधित इकाइयों का ऑडिट कैसे नहीं करें?

मेरे पास एक ऑडिट इकाई है, Foo, जिसमें गुणों के रूप में List<Bar> है। हालांकि, मैं Bar इकाइयों का ऑडिट नहीं करना चाहता हूं। इस प्रकार, मैं ने लिखा है कि:

@Entity 
@Audited 
public class Foo { 

    @JoinTable(name = "T_FOO_BAR", joinColumns = @JoinColumn(name = "FOO_ID"), inverseJoinColumns = @JoinColumn(name = "BAR_ID")) 
    @ManyToMany(cascade = PERSIST) 
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
    public List<Bar> getBars() { 
     return bars; 
    } 

} 

अब, मैं Foo के एक संशोधन प्राप्त करना चाहते हैं: दुर्भाग्य से

AuditReader reader = AuditReaderFactory.get(getEntityManager()); 
    Foo revision = (Foo) reader.createQuery().forEntitiesAtRevision(Foo.class, 42).getSingleResult(); 

, जब मैं सभी डेटा प्राप्त करना चाहते हैं (यानी जब यह आलसी लोड bars) , मैं, त्रुटि ORA-00942: table or view does not exist मिल के रूप में यह क्वेरी करने के लिए करने की कोशिश की:

select ... from T_FOO_BAR_AUD x, T_BAR y where ... 

मैं यह है कि @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) का उपयोग कर, हाइबरनेट Envers लिंक रखेंगे Barवर्तमान इकाई के आइटम के साथ।

तो मैं T_BAR और T_FOO_BAR (जॉइन टेबल) तालिकाओं का स्पष्ट रूप से ऑडिट करने के बिना, मेरी समस्या को कैसे हल कर सकता हूं? दूसरे शब्दों में, जब मैं अपनी संशोधन इकाई से bars की सूची पुनर्प्राप्त करता हूं, तो मुझे अपनी वर्तमान इकाई से bars की सूची मिलती है (क्योंकि Foo और Bar के बीच के लिंक ऑडिट नहीं किए जाते हैं)।

धन्यवाद।

उत्तर

18

ऐसा लगता है कि आप @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) का उपयोग कर रहे हैं जब आपको अपने मामले में @NotAudited का उपयोग करना चाहिए।

RelationTargetAuditMode.NOT_AUDITEDलक्ष्य इकाई का ऑडिट नहीं करेगा। यह अभी भी List<Bar>Foo की संपत्ति, और इस प्रकार तालिका में शामिल होने का प्रयास करेगा।

डॉक्स से:

आप एक रिश्ता है, जहां लक्ष्य इकाई नहीं लेखा परीक्षित है ऑडिट करने के लिए चाहते हैं (कि शब्दकोश की तरह संस्थाओं, जो बदल सकते हैं और नहीं है के साथ उदाहरण के लिए मामला है ऑडिट करने की आवश्यकता नहीं है), @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) के साथ इसे पर एनोटेट करें। फिर, जब आपकी इकाई के ऐतिहासिक संस्करणों को पढ़ते हैं, तो संबंध हमेशा "वर्तमान" संबंधित इकाई को इंगित करेगा।

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