How to implement a complex many to many relationship in JPA?

前端 未结 3 696
独厮守ぢ
独厮守ぢ 2020-12-30 17:00

Here the db schema

CREATE TABLE Products
(
    id          INT NOT NULL AUTO_INCREMENT,
    category_id  INT NOT NULL,
    description VARCHAR(100),
    pric         


        
3条回答
  •  情深已故
    2020-12-30 17:26

    When i did this before (as detailed in this question and answer), i made the fields in the embeddable ID primitives (corresponding to the ID fields of the entities referred to), and then used @MapsId in the entity. I believe this is the simplest (and dare i say correct) of meeting all the requirements: that the fields in the entity are relationships, that the fields in the ID class are primitive, that every column is mapped exactly once (the @MapsId fields not really being mappings, but sort of aliases).

    Applying that to your case, the ID class looks like:

    @Embeddable
    public class OrderDetailPK {
        private final int productId;
        private final int orderId;
    
        public OrderDetailPK(int productId, int orderId) {
            this.productId = productId;
            this.orderId = orderId;
        }
    }
    

    And the entity class looks like:

    public class OrderDetail {
        @EmbeddedId
        private OrderDetailPK id;
    
        @ManyToOne(cascade = CascadeType.ALL)
        @MapsId("productId")
        private Product product;
    
        @ManyToOne(cascade = CascadeType.ALL)
        @MapsId("orderId")
        private Order order;
    
        private int quantity;
        private double subtotal;
    
        public OrderDetail(Product product, Order order, int quantity, double subtotal) {
            this.id = new OrderDetailPK(product.getId(), order.getId());
            this.product = product;
            this.order = order;
            this.quantity = quantity;
            this.subtotal = subtotal;
        }
    
        protected OrderDetail() {}
    }
    

提交回复
热议问题