gpt4 book ai didi

java - 将多个表映射到一个 List Hibernate

转载 作者:行者123 更新时间:2023-11-29 02:59:18 25 4
gpt4 key购买 nike

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

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

我正在开发契约(Contract)维护。 (表:contrat_mercan)。对于契约(Contract),我们将选择一个类别(表:categoria),每个类别都有质量(表:calidad)在关系1 - N(关系表categoria_calidad ).

对于选择了类别的每个契约(Contract),这种品质必须有一个值,因此我创建了一个表来涵盖这种关系: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 时的级联像其他实体一样的契约(Contract),但我找不到在 contrat_mercan 表中制作 List 的方法。

这对于同一张表中的其他关系非常有效:

@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;

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

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

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

谢谢!!

最佳答案

如果您想从 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 注释。

希望这对您有所帮助!

关于java - 将多个表映射到一个 List Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26421859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com