非冗余 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.
数据库中有“糕点”。一块糕点含有零种、一种或多种过敏原。
因此我在 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.