将多个表映射到一个List Hibernate

时间:2014-10-17 09:21:29

标签: java mysql hibernate jpa

我一直在网上搜索,找到解决方案。似乎没有人有答案......我开始以为我的方式错误地解决了这个问题。

让我们看看我是否可以轻松解释。

我正在开发合同维护。 (表: 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。但它对hibernate没有用。

无论如何,现在 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实体 contrat_mercan 中有这样一个字段:

private List<ContratoCategoriaCalidad> relacionContratoCategoriaCalidad;

不是数据库中的真实列,只是表示关系。

我找到了加入同一个表herehere的多个字段的解决方案,但没有与3个表建立关系......

有什么想法吗?我做错了什么?也许我必须使用中间表 categoria_calidad 来执行此操作?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果要从Contrato实体访问相关的ContratoCategoriaCalidad对象列表,则需要使用适当的注释声明这两个实体之间的关系。

在ContratoCategoriaCalidad类中将字段更改为:

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

在Contrato类中添加字段:

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

如果要启用级联更新和删除,请考虑将cascade = CascadeType.ALL和orphanRemoval = true属性添加到@OneToMany注释。

希望这有帮助!