【问题标题】:Mapping multiple tables to one List Hibernate将多个表映射到一个 List Hibernate
【发布时间】:2014-12-12 20:24:49
【问题描述】:

我一直在网上寻找解决方案。似乎没有人知道答案...我开始认为我解决问题的方式不对。

让我们看看我是否可以简单地解释一下。

我正在开发合同维护。 (表: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 实体 contrat_mercan 中有一个像这样的字段:

private List<ContratoCategoriaCalidad> relacionContratoCategoriaCalidad;

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

我找到了连接同一个表的多个字段的解决方案,herehere,但不与 3 个表建立关系...

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

谢谢!!

【问题讨论】:

    标签: java mysql hibernate jpa


    【解决方案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 注释。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-10
      • 2013-08-20
      • 2010-12-12
      • 2014-01-15
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      相关资源
      最近更新 更多