非冗余 Hibernate 列表映射 (OneToMany)

Non-Redundant Hibernate List-Mapping (OneToMany)

数据库中有“糕点”。一块糕点含有零种、一种或多种过敏原。

因此我在 Pastry 中使用了一个具有@OneToMany 关系的列表。现在,通过这种管理关系的方式,我们得到了冗余条目,因为每个糕点都会创建一个具有相同过敏原的新条目:

我们当前的解决方案如下所示:

这两个数据库 table 之间的映射-table。

如何通过直接引用 Pastry class 列表中的过敏原元素来实现非冗余解决方案?我在谷歌上搜索了很多,但遗憾的是找不到任何有用的东西。

看起来像这样:

关于我对解决方案的评论:

你需要的是一个叫做JoinTable的。根据您的模式定义,这可以作为一个潜在的例子:

@Data
@Entity(name = "Pastry")
@Table(name = "PASTRY")
public class Pastry {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @ManyToMany
    @JoinTable(
        name = "PASTRY_ALLERGEN",
        foreignKey = @ForeignKey(name = "FK_PASTRY_ALLERGEN_PASTRY"),
        inverseForeignKey = @ForeignKey(name = "FK_PASTRY_ALLERGEN_ALLERGEN"),
        joinColumns = @JoinColumn(name = "pastry_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "allergen_id", referencedColumnName = "id")
    )
    private Set<Allergen> allergens = new HashSet<>();

}

对于 Pastry 协会和:

@Data
@Entity(name = "Allergen")
@Table(name = "ALLERGEN")
public class Allergen {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

}

为了 Allergen 协会。

此映射将依次生成一个名为 PastryAllergens 的中间 table,它将引用 Pastry table 的 PK 和 Allergen table.