2014-10-17 109 views
2

我一直在網上搜索找出解決方案。似乎沒有人有答案......我開始認爲我在解決問題的方式是錯誤的。將多個表映射到一個列表休眠

讓我們看看我能否解釋簡單。

我正在開發合同維護。 (表:contrat_mercan)。對於合同,我們將選擇一個類別(表格:categoria),每個類別具有關係1-N(關係表categoria_calidad)的品質(表格:calidad)。

這個質量必須爲每個合同選擇一個類別的價值,所以我創建了一個表來涵蓋這種關係:contrato_categoria_calidad。

@Entity 
@Table(name = "contrato_categoria_calidad") 
public class ContratoCategoriaCalidad implements Serializable{ 

    // Constants -------------------------------------------------------- 
    private static final long serialVersionUID = -1821053251702048097L; 

    // Fields ----------------------------------------------------------- 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "CCC_ID") 
    private int id; 

    @Column(name = "CONTRAT_MERCAN_ID") 
    private int contratoId; 

    @Column(name = "CATEGORIA_ID") 
    private int categoriaId; 

    @Column(name = "CALIDAD_ID") 
    private int calidadId; 

    @Column(name = "VALOR") 
    private double valor; 

    .... getters/ setters 

在此表中我想避免具有Id,三個字段被標記爲FK在數據庫和第一次嘗試與所述三個字段@JoinColumn其中。但它不適用於休眠。

無論如何,現在ContratoCategoriaCalidad作爲獨立的實體表現良好。但我將需要實施所有維護,更新,刪除手動每個案件... :(

我真的想要什麼,(我認爲是一個更好的做法)是一個級聯當我saveOrUpdate合同作爲其他實體做,但我不覺得做一個列表在contrat_mercan路表

這是在同一個表中的其他關係工作完美:

@OneToOne 
@JoinColumn(name="CONDICION") 
private Condicion condicion; 

@OneToMany (cascade = {CascadeType.ALL}) 
@JoinTable(
     name="contrato_mercan_condicion", 
     joinColumns = @JoinColumn(name="CONTRATO_MERCAN_ID") 
     ,inverseJoinColumns = @JoinColumn(name="CONDICION_ID") 
) 
private List<Condicion> condiciones; 

但我所有的嘗試這個映射失敗了,我想要的是在我的Java實體中有contr at_mercan場這樣的:

private List<ContratoCategoriaCalidad> relacionContratoCategoriaCalidad; 

不是在數據庫中的實際列,只是關係的表示。

我找到的解決辦法加入同一個表,here的多個領域,並here,但不是真正的關係有3個表...

任何想法?我做錯了什麼?也許我必須使用中級表categoria_calidad來執行此操作?

謝謝!

回答

1

如果要從Contrato實體訪問相關ContratoCategoriaCalidad對象的列表,則需要使用適當的註釋聲明這兩個實體之間的關係。

在ContratoCategoriaCalidad類變化領域:

@ManyToOne 
@JoinColumn(name = "CONTRATO_ID") 
private Contrato contrato; 

在Contrato類添加字段:

@OneToMany(mappedBy = "contrato") 
private List<ContratoCategoriaCalidad> relacionContratoCategoriaCalidad; 

如果要啓用級聯更新和刪除的考慮增加級聯= CascadeType.ALL和orphanRemoval =真正的屬性到@OneToMany註解。

希望這會有所幫助!