代码之家  ›  专栏  ›  技术社区  ›  Lolly

Spring boot Jpa与部分嵌入Id的关系

  •  0
  • Lolly  · 技术社区  · 3 年前

    我正在Spring Boot数据JPA中创建实体关系。由于这些表是遗留的,我无法修改或添加列。问题是我得到了一个错误,如果点部分嵌入的Id。

    我的实体类如下所示:

    Class Customer {
       @EmbededId
       private CustomerPk id;
       
       @Column("NAME")
       private String name; 
       
       @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="customerDetails")
       private List<Purchase> purchaseDetails;
       ...
    }
    
    @Embeddable
    Class CustomerPk {
       @Column("CUSTOMER_ID")
       private String customerId
           
       @Column("PURCHASE_ID")
       private String productId; 
    
       @Column("PURCHASE_DATE")
       private String date; 
    
       
     }
    

    采购实体如下所示:

    Class Purchase {
           @EmbededId
           private PurchasePK id;
           
           @Column("TRANSACTION_NAME")
           private String transactionName; 
           
           @ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
           @JoinColumns({
             @JoinColumn(name="CUSTOMER_ID" referencedColumnName="CUSTOMER_ID")
             @JoinColumn(name="PURCHASE_ID" referencedColumnName="PURCHASE_ID")
           )}
           private Customer customerDetails;
           ...
        }
    
        @Embeddable
        Class PurchasePK {
           @Column("CUSTOMER_ID")
           private String customerId
               
           @Column("PURCHASE_ID")
           private String productId; 
    
           @Column("TRANSACTION_DATE")
           private String date; 
         }
    

    有了上面的结构,我得到了org.hibernate。AnnotationException:PURCHASE.CUSTOMER的referencedColumnNames(CUSTOMER_ID,PURCHASE_ID)引用未映射到单个属性的CUSTOMER的详细信息。

    如果我从CustomerPK中删除日期属性,我就可以启动服务器。但根据当前的要求,我需要日期作为CustomerPK类的一部分。

    我想如果我使用复合键的一部分作为Join Columns,我会得到这个错误。

    0 回复  |  直到 3 年前
        1
  •  0
  •   Ibrahim AlTamimi    3 年前

    工作版本:

    @Entity
    public class Customer {
        @EmbeddedId
        private CustomerPk id;
    
        @Column(name = "NAME")
        private String name;
    
        @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customerDetails")
        private List<Purchase> purchaseDetails;
    }
    
    @Embeddable
    public class CustomerPk implements Serializable {
        @Column(name = "CUSTOMER_ID")
        private String customerId;
    
        @Column(name = "PURCHASE_ID")
        private String productId;
    
        @Column(name = "PURCHASE_DATE")
        private String date;
    }
    
    @Entity
    public class Purchase {
        @EmbeddedId
        private PurchasePK id;
    
        @Column(name = "TRANSACTION_NAME")
        private String transactionName;
    
        @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        @JoinColumns({
                @JoinColumn(name = "CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID", insertable = false, updatable = false),
                @JoinColumn(name = "PURCHASE_ID", referencedColumnName = "PURCHASE_ID", insertable = false, updatable = false),
                @JoinColumn(name = "PURCHASE_DATE", referencedColumnName = "PURCHASE_DATE", insertable = false, updatable = false)
        })
        private Customer customerDetails;
    }
    
    @Embeddable
    public class PurchasePK implements Serializable {
        @Column(name = "CUSTOMER_ID")
        private String customerId;
    
        @Column(name = "PURCHASE_ID")
        private String productId;
    
        @Column(name = "TRANSACTION_DATE")
        private String date;
    }
    
    

    结论

    提供的信息来自 射线 有效,您错过了添加所需的连接列以表示完整的实体关系,关于您的注释 射线 重点,是的,你是对的,两列的用法不同,但两列都有自己的名称,在运行时不会覆盖任何行值。

    以上表格和表示的结果如下:

    
    create table customer
    (
        customer_id   varchar(255) not null,
        purchase_date varchar(255) not null,
        purchase_id   varchar(255) not null,
        name          varchar(255),
        primary key (customer_id, purchase_date, purchase_id)
    );
    create table purchase
    (
        customer_id      varchar(255) not null,
        transaction_date varchar(255) not null,
        purchase_id      varchar(255) not null,
        transaction_name varchar(255),
        purchase_date    varchar(255),
        primary key (customer_id, transaction_date, purchase_id)
    );
    alter table purchase
        add constraint FK6rkrb8rq8x56kai7g5gm32d1y foreign key (customer_id, purchase_date, purchase_id) references customer;