2014-10-17 102 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注解。

希望这会有所帮助!