提问者:小点点

复合PK不起作用的JPA@JoinTable和@JoinCol


你好,当我在两个实体(其中一个具有复合主键)之间执行JoinTable时,我无法理解错误。

我的实体:


    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Entity
    @Table(name = "meds")
    public class Meds {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
    
        @Column
        private String name;
    
        @Column
        private BigDecimal price;
    
        @Column
        private String category;
    
        @Column
        private int pillNumber;
    
        @Column
        private Date date;
    
        @JsonIgnore
        @ManyToMany(mappedBy = "assignedMeds")
        private Set<Plans> plans = new HashSet<>();
    
    }


    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Entity
    @Table(name = "plans")
    @IdClass(PlansPKId.class)
    public class Plans {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long planId;
    
        @Id
        @Column
        private Date planDate; // format: yyyy-mm-dd
    
        @Column
        private String planName;
    
        @Column
        private String weekday;
    
        @ManyToMany
        @JoinTable(name = "Plan_Meds", joinColumns = @JoinColumn(name = "planDate", referencedColumnName = "planId"), inverseJoinColumns = @JoinColumn(name = "id"))
        private Set<Meds> assignedMeds = new HashSet<>();
    
    }

我的计划PKId类:


    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @EqualsAndHashCode
    public class PlansPKId implements Serializable {
    
        private long planId;
    
        private Date planDate; // format: yyyy-mm-dd
    }

和我的错误:

我尝试了@JoinColumn(name=“planDate”,referencedColumnName=“planId”),也尝试了其他方法,首先使用planId,但发生了同样的事情。可能出了什么问题?当做


共1个答案

匿名用户

对在计划类中使用复合Id不感兴趣:计划ID已经是唯一的并由数据库生成。但这不是问题所在,您需要映射所有列ids planDate和planId。

@ManyToMany
@JoinTable(name = "Plan_Meds", joinColumns = {
        @JoinColumn(name = "planDate", referencedColumnName = "planDate")
        @JoinColumn(name = "planId", referencedColumnName = "planId")
}, inverseJoinColumns = @JoinColumn(name = "id"))
private Set<Meds> assignedMeds = new HashSet<>();