关于java:将多个表映射到一个列表hibernate

Mapping multiple tables to one List Hibernate

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

让我看看我能否解释简单。

我正在开发合同维护。 (表:contrat_mercan)。对于合同,我们将选择一个类别(表:categoria),每个类别具有与关系1-N(关系表categoria_calidad)相关的质量(表:calidad)。

在选择了类别的每个合同中,此质量必须具有一个值,因此我创建了一个表来涵盖此关系:contoto_categoria_calidad。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@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与其他实体进行合同时,我真正想要的(并且我认为是更好的做法)是一个级联,但是我找不到在contt_mercan表中创建List的方法。铅>

这非常适合同一表中的其他关系:

1
2
3
4
5
6
7
8
9
10
11
@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实体中拥有一个contt_mercan这样的字段:

1
private List<ContratoCategoriaCalidad> relacionContratoCategoriaCalidad;

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

我找到了在同一位置,此处和此处连接同一表的多个字段的解决方案,但没有与3个表建立关系...

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

谢谢!!


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

在ContratoCategoriaCalidad类更改字段中:

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

在Contrato类中添加字段:

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

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

希望这会有所帮助!