2016-07-01 5 views
5

मैं इकाइयों से फ़ाइल नाम उत्पन्न करने के लिए एक स्पेल टेम्पलेट का उपयोग करने की कोशिश कर रहा हूं। मैं दो संस्थाओं है कि इन के जैसे दिखाई देते हैं: वसंत अभिव्यक्ति भाषा (एसपीईएल) जेपीए/हाइबरनेट इकाई पर काम नहीं कर रही है

@Entity 
public class Invoice implements Serializable { 
    private String invoicenumber; 
    private Customer customer; 

    @Column(name = "invoicenumber", nullable = false, length = 20) 
    public String getInvoicenumber() { 
     return this.invoicenumber; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "fk_customer", nullable = false) 
    public Customer getCustomer() { 
     return this.customer; 
    } 
} 

@Entity 
public class Customer implements Serializable { 
    private String firstname; 
    private String lastname; 

    @Column(name = "firstname", nullable = false, length = 20) 
    public String getFirstname() { 
     return this.firstname; 
    } 

    @Column(name = "lastname", nullable = false, length = 20) 
    public String getLastname() { 
     return this.lastname; 
    } 
} 

और एक स्पेल टेम्पलेट के समान इस एक:

String template = "invoicenumber + '-' + customer.firstname + ' ' + customer.lastname"; 

तब मैं स्पेल का उपयोग एक चालान वस्तु के साथ टेम्पलेट से कोई फ़ाइल नाम उत्पन्न करने के लिए

public String generateFilename(String filenameTemplate, Object dataObject) { 
    ExpressionParser parser = new SpelExpressionParser(); 
    Expression expression = parser.parseExpression(filenameTemplate); 
    return expression.getValue(dataObject, String.class); 
} 

यह परीक्षण काम करता है:

String testTemplate = "invoicenumber + '-' + customer.firstname + ' ' + customer.lastname"; 
Invoice invoice = new Invoice(); 
invoice.setInvoicenumber("BF2016-06-ABCDEF"); 
invoice.setCustomer(new Customer()); 
invoice.getCustomer().setFirstname("Hans"); 
invoice.getCustomer().setLastname("Hansen"); 
assertEquals("BF2016-06-ABCDEF-Hans Hansen", generator.generateFilename(testTemplate, invoice)); 

यह परीक्षण नहीं करता है:

Invoice invoice = invoiceRepository.findOne(4); 

String template = "invoicenumber + '-' + customer.firstname + ' ' + customer.lastname"; 
String filename = filenameGenerator.generateFilename(template, invoice); 
assertEquals("12344-201601-Heinrich Jahnke", filename); 

यह परीक्षण वास्तव में, "12344-201601-" में परिणाम है जो मुझे इस धारणा की ओर जाता है, कि हाइबरनेट आलसी लोड करने के लिए ग्राहक वस्तु इस्तेमाल किया प्रॉक्सी समस्या है । पहले नाम और अंतिम नाम फ़ील्ड डेटाबेस से लोड होने से पहले शून्य हैं, जो प्रस्तुत फ़ाइल नाम की व्याख्या करेंगे।

इसे ठीक करने के तरीके पर कोई विचार? कुछ बातें मैं पहले से ही करने की कोशिश की:

Hibernate.initialize(invoice); 
Hibernate.initialize(invoice.getCustomer()); 
System.out.println(invoice.getCustomer().getFirstname()); 
  • का उपयोग करना "customer.getFirstname()" "customer.firstname" के बजाय अभिव्यक्ति में
  • मेरी FilenameGenerator वर्ग के लिए @Transactional जोड़ना
+0

यदि आप FetchType.EAGER का उपयोग करते हैं तो यह काम करता है? मेरा मतलब है, मैं उम्मीद करता हूं कि यह किसी भी तरह से काम करे, लेकिन यह पुष्टि करने में मदद कर सकता है कि क्या स्पेल आलसी लोडिंग प्रॉक्सी का सही उपयोग नहीं कर रहा है –

उत्तर

1

समस्या कहीं और थी, स्पेल और जेपीए/हाइबरनेट एक साथ ठीक काम कर रहे हैं। उसके लिए खेद है!

मेरे वास्तविक अभिव्यक्ति इस तरह देखा:

"invoicenumber + '-' + (customer.company == null ? customer.fname + ' ' + customer.sname : customer.company)" 

दुर्भाग्य से ग्राहक है कि डेटाबेस से लोड किया गया था था कि अभिव्यक्ति सब कुछ निम्नलिखित के साथ एक कंपनी, एक खाली कंपनी ... है बाहर काम करता है सही ढंग से:

"invoicenumber + '-' + (customer.company == null or customer.company.isEmpty() ? customer.fname + ' ' + customer.sname : customer.company)" 
संबंधित मुद्दे