JPA 实体,如何连接表
Posted
技术标签:
【中文标题】JPA 实体,如何连接表【英文标题】:JPA Entitties, how to join tables 【发布时间】:2018-02-25 18:41:55 【问题描述】:我有三张桌子
CREATE TABLE "ingredient" (
"id" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1) PRIMARY KEY,
"ingredient" VARCHAR(50) NOT NULL
);
CREATE TABLE "pizza" (
"id" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1, INCREMENT BY 1) PRIMARY KEY,
"pizza" VARCHAR(50) NOT NULL
);
CREATE TABLE "pizza_structure" (
"pizza_id" INT NOT NULL,
"ingredient_id" INT NOT NULL,
"amount" INT NOT NULL
);
如何加入他们,将 Pizzas 结构作为地图
@Entity
@Table(name = "ingredient")
public class Ingredient
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
public Ingredient()
@Entity
@Table(name = "pizza")
public class Pizza
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany ????
private Map<Ingredient, Integer> pizzaStructure;
public Pizza()
public Pizza(String name, Map<Long, Integer> pizzaStructure)
this.name = name;
this.pizzaStructure = pizzaStructure;
是否需要创建@Embeddable 类PizzaStructure,如果需要,何时使用?
现在我遇到了一个错误 调用 init 方法失败;嵌套异常是 org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany 针对未映射的类:
【问题讨论】:
【参考方案1】:如何加入他们,将 Pizzas 结构作为地图
看起来像这样:
@ElementCollection
@CollectionTable(name = "pizza_structure", joinColumns = @JoinColumn(name = "pizza_id"))
@Column(name = "amount")
@MapKeyJoinColumn(name = "ingredient_id")
private Map<Ingredient, Integer> pizzaStructure;
我需要创建@Embeddable 类PizzaStructure
没有。
更多信息在这里:Hibernate User Guide - Maps。
请注意,表 pizza_structure
应该具有指向 pizza
和 ingredient
表的外键以及 pizza_id
和 ingredient_id
的唯一约束,就像这样(它是 postgresql 方言):
create table pizza_structure
(
pizza_id ... constraint fk_structure_pizza references pizza,
ingredient_id ... constraint fk_structure_ingredient references ingredient,
amount ...,
constraint pizza_structure_pkey primary key (pizza_id, ingredient_id)
);
【讨论】:
【参考方案2】:比萨和配料之间存在多对多关系,并且关系中有一个附加列。 我在这里发现了一个类似的问题:JPA 2.0 many-to-many with extra column (我会发表评论,但我没有足够的声誉。)
【讨论】:
以上是关于JPA 实体,如何连接表的主要内容,如果未能解决你的问题,请参考以下文章