【问题标题】:Spring Boot: How to create an Entity with a composite keySpring Boot:如何使用复合键创建实体
【发布时间】: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 作为复合键,但我想先确认在这种情况下我是否应该这样做,除非不是这样,也许还有更多方法。

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

【问题讨论】:

    标签: java spring-boot orm hibernate-mapping


    【解决方案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 中的外观。
    猜你喜欢
    • 2022-12-15
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    相关资源
    最近更新 更多