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 应该具有指向 pizzaingredient 表的外键以及 pizza_idingredient_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 实体,如何连接表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA 和 Hibernate 连接两个不相关的实体

JPA-在非实体类中连接两个表

使用具有一对多关系的 JPA 映射实体,如何添加连接条件

在 Spring Data JPA 中连接两个表实体

后端数据库异步更改时如何刷新JPA实体?

JPA 2,没有实体映射的连接条件查询