我一直在网上搜索,找到解决方案。似乎没有人有答案......我开始以为我的方式错误地解决了这个问题。
让我们看看我是否可以轻松解释。
我正在开发合同维护。 (表: 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;
不是数据库中的真实列,只是表示关系。
我找到了加入同一个表here和here的多个字段的解决方案,但没有与3个表建立关系......
有什么想法吗?我做错了什么?也许我必须使用中间表 categoria_calidad 来执行此操作?
谢谢!
答案 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注释。
希望这有帮助!