2016-08-18 167 views
0

我有一個實體,其中有兩個相同類型的Embedded類,哪一個具有相同類型二的ElementCollection。業務邏輯顯然是正確的,但我猜,JPA缺乏知識,所以我遇到了一些問題。jpa - 兩個不同的@Embeddable類中的多個@ElementCollection

讓我們來看看我的課:

@Entity 
public class Etapa extends EntidadeBase { 

    @Embedded 
    private CronogramaDeDesembolso cronogramaDeReceita; 

    @Embedded 
    private CronogramaDeDesembolso cronogramaDeDespesa; 
} 

@Embeddable 
public class CronogramaDeDesembolso { 

    @ElementCollection 
    private List<Parcela> parcelas; 
} 

我收到以下錯誤日誌。

產生的原因:org.hibernate.HibernateException:找到共享引用 到集合: nexxus.convenioestadual.dominio.planodetrabalho.etapa.Etapa.cronogramaDeReceita.parcelas

難道你們有什麼什麼是錯誤的線索,我該如何解決它?

編輯:

由於意見我這樣做編輯和它不工作太

@Entity 
public class Etapa extends EntidadeBase { 

    @Embedded 
    @AttributeOverride(name = "parcelas", column = @Column(name = "parcelasReceita")) 
    private CronogramaDeDesembolso cronogramaDeReceita; 

    @Embedded 
    @AttributeOverride(name = "parcelas", column = @Column(name = "parcelasDespesa")) 
    private CronogramaDeDesembolso cronogramaDeDespesa; 
} 

回答

0

在谷歌快速搜索打開了這個在StackOverflow的:

JPA Multiple Embedded fields

看起來好像你必須做一些明確的註釋覆蓋領域wi使可嵌入類更薄。在鏈接的答案中還有一些代碼示例,應該給你一個好的想法。

乾杯,

+0

我已經嘗試過同樣的職務,做 '@AttributeOverride(NAME = 「parcelas」,列= @Column(name = 「parcelasDespesa」))' 但不改變屬性_parcelas_和錯誤的名稱持續存在 – higornucci

+0

您是否在每個嵌入對象上使用該行代碼?我相信他們實際上需要引用數據庫中的不同物理列。所以它需要看起來更像這樣(假設我正確理解這一點): '@ Embedded' '@AttributeOverride(name =「parcelas」,column = @Column(name =「parcelasDeReceita」))'' '私人CronogramaDeDesembolso cronogramaDeReceita;'' @ Embedded' '@AttributeOverride(NAME = 「parcelas」,列= @Column(name = 「parcelasDespesa」))'' 私人CronogramaDeDesembolso cronogramaDeDespesa;' –

+0

我給你建議的修改它仍然不起作用= [ – higornucci

1

你有什麼理由爲什麼你決定使用這種結構?通常,在將對象轉換爲RDBMS時,您需要對關係進行建模。當你使用可嵌入的方式時,它會將與之相關聯的列(或列)添加到表格中。所以當你通常這樣做(而不是集合)時,它很好。

當你做一個集合時,它會遇到問題。主要是沒有辦法在一行中表示一個集合(因爲這是一個實體,對於每個只有一行的對象,它們可以有效地實現其中的許多)&一列。所以當你代表一個集合時,你實際上必須有一個第二個表格,其中有一列將其引用回第一個表格。這是一個正常對象的相反思想。收集條目需要知道它們與哪些集合相關聯,而不是收集條目的知識。

所以在一些POJO,你可以有這些....

MyListObject { 
    //Some implementation of things you want to collect 
} 


MyClass { 
    List<MyListObject> myListObject; 
} 

但在JPA來模擬這一點,你需要有這兩個表來表示。

您的對象將在列表中。

@Entity 
MyListObject { 

    @ManyToOne 
    @JoinColumn(name = "MY_CLASS_KEY") 
    private MyClass myClass; 
} 

您的對象/實體將有列表。

@Entity 
MyClass { 

    @Id 
    @Column(name = "MY_CLASS_KEY") 
    private Long myClassKey; 

    @OneToMany(mappedBy = "myClass") 
    private List<MyListObject> myString; 
} 

我希望這會有所幫助。

相關問題