2012-03-23 18 views
13

ho lezione di denaro che è un @Embeddablenidificato incorporabile - AttributeOverride per integrabile all'interno embeddable

@Embeddable 
public class Money implements Serializable, Comparable<Money> { 
    @Column(name = "amount", precision = 15, scale = 2) 
    private BigDecimal amount; 
} 

Quando ho UseIt tempo multiple all'interno entità, tutto funziona bene. Ad esempio

@Entity 
public class SomeEntity implements Serializable { 

    @Embedded 
    @AttributeOverride(name = "amount", column = @Column(name = "entry")) 
    private Money entryValue; 

    @Embedded 
    @AttributeOverride(name = "amount", column = @Column(name = "leave")) 
    private Money leaveValue; 
} 

Il codice sopra funziona perfettamente.

Ora il problema si verifica quando ho un altro @Embeddable che voglio avere istanze di Money in esso e che @Embeddable è utilizzato da un'entità più volte. Esempio:

  1. integrabile

    @Embeddable 
    public class ReportCostValues implements Serializable { 
    
        @Embedded 
        @AttributeOverride(name = "amount", column = @Column(name = "covered_by_grant")) 
        private Money coveredByGrant; 
    
        @Embedded 
        @AttributeOverride(name = "amount", column = @Column(name = "own_resources")) 
        private Money foundedFromOwnResources; 
    
        @Embedded 
        @AttributeOverride(name = "amount", column = @Column(name = "personal_contribution")) 
        private Money personalContribution; 
    
  2. Entity

    @Entity 
    public class ReportCostEntity implements Identifiable<Long>, Serializable { 
    
        @Id 
        private Long id; 
    
        @Embedded  
        private ReportCostValues contracted; 
    
        @Embedded  
        private ReportCostValues current; 
    
        @Embedded   
        private ReportCostValues previousReport; 
    

Questo codice sopra non funzionerà. Qualche idea su come affrontare questo problema?

risposta

25

Ciao devi usare @AttributeOverrides in modo giudiziale, devi sostituire gli attributi ancora una volta in entità che hai fatto nella classe incorporabile ReportCostValues, il codice di speranza qui sotto è quello che stai cercando.

@Entity 
public class ReportCostEntity implements Serializable { 

    @Id 
    private Long id; 

    @Embedded 
    @AttributeOverrides({ 
     @AttributeOverride(name="coveredByGrant.amount", column = @Column(name="contracted_coveredByGrant")), 
     @AttributeOverride(name="foundedFromOwnResources.amount", column = @Column(name="contracted_foundedFromOwnResources")), 
     @AttributeOverride(name="personalContribution.amount", column = @Column(name="contracted_personalContribution")) 
    }) 
    private ReportCostValues contracted; 

    @Embedded 
    @AttributeOverrides({ 
     @AttributeOverride(name="coveredByGrant.amount", column = @Column(name="current_coveredByGrant")), 
     @AttributeOverride(name="foundedFromOwnResources.amount", column = @Column(name="current_foundedFromOwnResources")), 
     @AttributeOverride(name="personalContribution.amount", column = @Column(name="current_personalContribution")) 
    }) 
    private ReportCostValues current; 

    @Embedded 
    @AttributeOverrides({ 
     @AttributeOverride(name="coveredByGrant.amount", column = @Column(name="previousReport_coveredByGrant")), 
     @AttributeOverride(name="foundedFromOwnResources.amount", column = @Column(name="previousReport_foundedFromOwnResources")), 
     @AttributeOverride(name="personalContribution.amount", column = @Column(name="previousReport_personalContribution")) 
    }) 
    private ReportCostValues previousReport; 




} 

Spero che questo aiuti !!!!!

+0

ha funzionato, grazie mille! –

+0

@PaulSzulc sei il benvenuto –