2016-07-01 11 views
5

エンティティからファイル名を生成するためにSpELテンプレートを使用しようとしています。 JPEL/Hibernateエンティティで動作しないSpring式言語(SpEL)

@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; 
    } 
} 

そして、これと同じSPELテンプレート:それから私は、請求書オブジェクトとテンプレートからファイル名を生成するために、SPELを

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

使用し、私はこれらのようになり、2つのエンティティをしている

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-」になり。 firstnameとlastnameフィールドは、レンダリングされたファイル名を説明する、データベースからロードされる前にヌルです。

これを修正する方法についてのご意見はありますか?私はすでに試したいくつかのもの:使用

Hibernate.initialize(invoice); 
Hibernate.initialize(invoice.getCustomer()); 
System.out.println(invoice.getCustomer().getFirstname()); 
  • "customer.getFirstnameを()" の代わりに "customer.firstname" の表現
  • の私FilenameGeneratorクラスに@Transactionalを追加
+0

FetchType.EAGERを使用すると機能しますか?つまり、いずれにしても動作すると期待していますが、SpELが遅延読み込みプロキシを正しく使用していないかどうかを確認するのに役立ちます –

答えて

1

SpELとJPA/Hibernateがうまく連携しています。そのために残念!

私の実際の表現は、このように見えた:

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

は、悲しいことに、データベースからロードされた顧客は会社、空の会社を持っていた...次の式のすべてを が正常にうまくいく:

"invoicenumber + '-' + (customer.company == null or customer.company.isEmpty() ? customer.fname + ' ' + customer.sname : customer.company)" 
関連する問題