简体   繁体   English

javax.persistence @JoinColumn 不工作

[英]javax.persistence @JoinColumn not working

I'm trying to join 2 tables (ManytoMany) and I'm getting this error:我正在尝试连接 2 个表 (ManytoMany),但出现此错误:

Caused by: org.hibernate.AnnotationException: referencedColumnNames(planDate, planId, weekday) of com.MD.Medicine.Models.Meds.assignedMeds referencing com.MD.Medicine.Models.Plans not mapped to a single property由以下原因引起:org.hibernate.AnnotationException:com.MD.Medicine.Models.Meds.assignedMeds 的 referencedColumnNames(planDate, planId, weekday) 引用 com.MD.Medicine.Models.Plans 未映射到单个属性

My entities, Plans.java:我的实体,Plans.java:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "plans")
@EqualsAndHashCode(exclude = "assignedMeds")
public class Plans {
    @EmbeddedId
    private PlansPKId plansPKId;

    @Column
    private String planName;

    @Column
    private String weekday;

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

}

PlansPKId.java (for Plans Model): PlansPKId.java(用于计划模型):

@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@Embeddable
public class PlansPKId implements Serializable {

    private Date planDate; // format: yyyy-mm-dd
    private long planId;

  

}

Meds.java:药物.java:

@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<>();

}

When I join only with this:当我只加入这个时:

@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<>();

It works properly, but if I had the column "weekday" I start getting the error.它工作正常,但如果我有“工作日”列,我就会开始收到错误消息。 Am I not supposed to join them like that?我不应该那样加入他们吗?

Yes, basically, the purpose of @JoinTable is to create an intermediate table that only contains keys of each participant table.是的,基本上, @JoinTable的目的是创建一个包含每个参与者表的键的中间表。

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

In this case,在这种情况下,

joinColumns = {
            @JoinColumn(name = "planDate", referencedColumnName = "planDate"),
            @JoinColumn(name = "planId", referencedColumnName = "planId")}

will refer to the key of your Plans entity plansPKId , and将引用您的Plans实体planPKId的密钥,并且

inverseJoinColumns = @JoinColumn(name = "id")

will refer to the Meds entity's key id .将引用Meds实体的密钥id Since weekday @JoinColumn(name = "weekday", referencedColumnName = "weekday") , it's not referring to any key, it should not be here.由于weekday @JoinColumn(name = "weekday", referencedColumnName = "weekday") ,它没有引用任何键,它不应该在这里。


In case you need to add some more fields in the join table, manually create your own join table and use @ManyToOne instead: manytomany如果您需要在连接表中添加更多字段,请手动创建自己的连接表并改用@ManyToOne: manytomany

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM