Spring Boot:如何使用复合键创建实体

Posted

技术标签:

【中文标题】Spring Boot:如何使用复合键创建实体【英文标题】:Spring Boot: How to create an Entity with a composite key 【发布时间】:2021-01-27 21:46:19 【问题描述】:

我正在使用图表为一个项目创建课程以用于练习目的,直到我偶然发现了这个order_items

创建OrdersProducts 之类的实体没有问题,因为我知道对于订单我只需要执行以下操作:

@Entity
@Table(name = "orders")
public class Orders 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "order_id")
    private Integer orderId;
    // rest of the code...

对于Products 类似:

@Entity
@Table(name = "products")
public class Products 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "product_id")
    private Integer productId;
    // rest of the code...

但是表order_items 有变量order_iditem_id,这算作复合键吗?如果是这样,这些变量在我的 OrderItems 类中应该如何显示?

@Entity
@Table(name = "order_items")
public class OrderItems 
    
    @Column(name = "order_id")
    private Integer orderId;
    @Column(name = "item_id")
    private Integer itemId;
    // rest of the code...

我检查了不同的问题,他们提到使用@IdClass@EmbeddableId 作为复合键,但我想先确认在这种情况下我是否应该这样做,除非不是这样,也许还有更多方法。

非常感谢您提供与此相关的意见和/或任何文章,感谢您抽出宝贵时间。

【问题讨论】:

【参考方案1】:

正如你所说,你可以使用@EmbeddableId

这里是例子:

@Embeddable
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
public class OrderItemsPK  implements Serializable 
private static final long serialVersionUID = 1L;

    @Column(insertable = false, unique = false, updatable = false, nullable = false,name = "order_id")
    private Long orderId;

    @Column(insertable = false, unique = false, updatable = false, nullable = false,name = "products_id")
    private Long productsId;

还有 Order Items 类。

@Entity
public class OrderItems 

    @EmbeddedId
    private OrderItemsPK id;

    @OneToOne
    @JoinColumn(name = "products_id", nullable = false, unique = false, insertable = false, updatable = false, referencedColumnName = "products_id")
    private Products products;

    @OneToOne
    @JoinColumn(name = "orders_id", nullable = false, unique = false, insertable = false, updatable = false, referencedColumnName = "orders_id")
    private Order order;

    private Long itemId;

【讨论】:

感谢您的回复,然后我将使用@Embeddable,您的示例确实让我部分了解了如何执行复合键操作,但我不会将其标记为答案,因为它不是指item_idOrderItems 中的外观。

以上是关于Spring Boot:如何使用复合键创建实体的主要内容,如果未能解决你的问题,请参考以下文章

Spring用外键保存复合主键

如何在Jpa中使用所选实体创建行,RestController Spring Boot

如何修复不兼容的外键约束spring boot

Spring boot UUID主键实体在创建后不显示正确的ID

如何在 Spring Boot 中使用复合主键从 MySql 中检索数据

如何进行 Hibernate XML 映射,一对多使用 1 PK 映射到另一个具有复合键的实体