Spring JPA向多对多实体添加实体集合

5ktev3wc  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(49)

我需要添加多个实体对象到多对多实体。
我有组件实体:

@Entity
@Table(name = "components", schema = "public", catalog = "inventory_db")
public class Component {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    @Column(name = "id", nullable = false)
    private Integer id;

    private Integer qty;

    @OneToMany(mappedBy = "component")
    @ToString.Exclude
    List<PurchaseOrder> purchaseOrders;
}

字符串
也有一个用户实体:

@Entity
@Table(name = "users")
@Getter
@Setter
@Accessors(chain = true)
@ToString
public class User {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    @Column(name = "id", nullable = false)
    private Integer id;

    @OneToMany(mappedBy = "user")
    List<PurchaseOrder> purchaseOrders;
}


最后,我有一个PurchaseOrder实体:

@Entity
@Table(name = "purchase_order")
public class PurchaseOrder {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    @Column(name = "id", nullable = false)
    private Integer id;

    @Enumerated
    @Column(name = "status")
    private PurchaseOrderStatus purchaseOrderStatus;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "user_id", nullable = false,
            foreignKey = @ForeignKey(name = "FK_PO_USER"))
    private User user;

    //TODO: I need to store here List<Component> - multiple components in one order of the user
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "component_id", nullable = false,
            foreignKey = @ForeignKey(name = "FK_RENT_BOOK_INFO_BOOK"))
    Component component;


我需要一个为User在一个PurchaseOrder中存储多个组件(列表)的能力。如何通过Spring JPA解决这个问题?

dfty9e19

dfty9e191#

您可以删除@JoinColumn注解,并简单地将两个实体中的关系更改为@ManyToMany。然后在PurchaseOrder中使用List. JPA Package 组件字段,然后自动创建一个名为purchase_order_component的表,该表将保存两个实体的ID。
purchaseOrder应该是这样的:

@Entity
@Table(name = "purchase_order")
public class PurchaseOrder {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "id", nullable = false)
private Integer id;

@Enumerated
@Column(name = "status")
private PurchaseOrderStatus purchaseOrderStatus;

@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@JoinColumn(name = "user_id", nullable = false, foreignKey = 
@ForeignKey(name = "FK_PO_USER"))
private User user;

@ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
List<Component> component;
}

字符串
和组件:

@Entity
@Table(name = "components", schema = "public")
public class Component {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "id", nullable = false)
private Integer id;

private Integer qty;

@ManyToMany(mappedBy = "component")
@ToString.Exclude
List<PurchaseOrder> purchaseOrders;
}


你可以让spring为你添加这个属性来生成数据库模式:

spring.jpa.hibernate.ddl-auto=update


或者这里是SQL等价物:

CREATE TABLE components (
    id serial4 NOT NULL,
    qty int4 NULL,
    CONSTRAINT components_pkey PRIMARY KEY (id)
);

CREATE TABLE users (
    id serial4 NOT NULL,
    CONSTRAINT users_pkey PRIMARY KEY (id)
);

CREATE TABLE purchase_order (
    id serial4 NOT NULL,
    user_id int4 NOT NULL,
    CONSTRAINT purchase_order_pkey PRIMARY KEY (id),
    CONSTRAINT fk_po_user FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE TABLE purchase_order_component (
    purchase_orders_id int4 NOT NULL,
    component_id int4 NOT NULL,
    CONSTRAINT fk_po FOREIGN KEY (purchase_orders_id) REFERENCES purchase_order(id),
    CONSTRAINT fk_component FOREIGN KEY (component_id) REFERENCES components(id)
);

相关问题