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

5ktev3wc  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(142)

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

  1. @Entity
  2. @Table(name = "components", schema = "public", catalog = "inventory_db")
  3. public class Component {
  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
  5. @Id
  6. @Column(name = "id", nullable = false)
  7. private Integer id;
  8. private Integer qty;
  9. @OneToMany(mappedBy = "component")
  10. @ToString.Exclude
  11. List<PurchaseOrder> purchaseOrders;
  12. }

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

  1. @Entity
  2. @Table(name = "users")
  3. @Getter
  4. @Setter
  5. @Accessors(chain = true)
  6. @ToString
  7. public class User {
  8. @GeneratedValue(strategy = GenerationType.IDENTITY)
  9. @Id
  10. @Column(name = "id", nullable = false)
  11. private Integer id;
  12. @OneToMany(mappedBy = "user")
  13. List<PurchaseOrder> purchaseOrders;
  14. }


最后,我有一个PurchaseOrder实体:

  1. @Entity
  2. @Table(name = "purchase_order")
  3. public class PurchaseOrder {
  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
  5. @Id
  6. @Column(name = "id", nullable = false)
  7. private Integer id;
  8. @Enumerated
  9. @Column(name = "status")
  10. private PurchaseOrderStatus purchaseOrderStatus;
  11. @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
  12. @JoinColumn(name = "user_id", nullable = false,
  13. foreignKey = @ForeignKey(name = "FK_PO_USER"))
  14. private User user;
  15. //TODO: I need to store here List<Component> - multiple components in one order of the user
  16. @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
  17. @JoinColumn(name = "component_id", nullable = false,
  18. foreignKey = @ForeignKey(name = "FK_RENT_BOOK_INFO_BOOK"))
  19. Component component;


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

dfty9e19

dfty9e191#

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

  1. @Entity
  2. @Table(name = "purchase_order")
  3. public class PurchaseOrder {
  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
  5. @Id
  6. @Column(name = "id", nullable = false)
  7. private Integer id;
  8. @Enumerated
  9. @Column(name = "status")
  10. private PurchaseOrderStatus purchaseOrderStatus;
  11. @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
  12. @JoinColumn(name = "user_id", nullable = false, foreignKey =
  13. @ForeignKey(name = "FK_PO_USER"))
  14. private User user;
  15. @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
  16. List<Component> component;
  17. }

字符串
和组件:

  1. @Entity
  2. @Table(name = "components", schema = "public")
  3. public class Component {
  4. @GeneratedValue(strategy = GenerationType.IDENTITY)
  5. @Id
  6. @Column(name = "id", nullable = false)
  7. private Integer id;
  8. private Integer qty;
  9. @ManyToMany(mappedBy = "component")
  10. @ToString.Exclude
  11. List<PurchaseOrder> purchaseOrders;
  12. }


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

  1. spring.jpa.hibernate.ddl-auto=update


或者这里是SQL等价物:

  1. CREATE TABLE components (
  2. id serial4 NOT NULL,
  3. qty int4 NULL,
  4. CONSTRAINT components_pkey PRIMARY KEY (id)
  5. );
  6. CREATE TABLE users (
  7. id serial4 NOT NULL,
  8. CONSTRAINT users_pkey PRIMARY KEY (id)
  9. );
  10. CREATE TABLE purchase_order (
  11. id serial4 NOT NULL,
  12. user_id int4 NOT NULL,
  13. CONSTRAINT purchase_order_pkey PRIMARY KEY (id),
  14. CONSTRAINT fk_po_user FOREIGN KEY (user_id) REFERENCES users(id)
  15. );
  16. CREATE TABLE purchase_order_component (
  17. purchase_orders_id int4 NOT NULL,
  18. component_id int4 NOT NULL,
  19. CONSTRAINT fk_po FOREIGN KEY (purchase_orders_id) REFERENCES purchase_order(id),
  20. CONSTRAINT fk_component FOREIGN KEY (component_id) REFERENCES components(id)
  21. );

展开查看全部

相关问题