簡體   English   中英

javax.persistence @JoinColumn 不工作

[英]javax.persistence @JoinColumn not working

我正在嘗試連接 2 個表 (ManytoMany),但出現此錯誤:

由以下原因引起:org.hibernate.AnnotationException:com.MD.Medicine.Models.Meds.assignedMeds 的 referencedColumnNames(planDate, planId, weekday) 引用 com.MD.Medicine.Models.Plans 未映射到單個屬性

我的實體,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(用於計划模型):

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

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

  

}

葯物.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<>();

}

當我只加入這個時:

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

它工作正常,但如果我有“工作日”列,我就會開始收到錯誤消息。 我不應該那樣加入他們嗎?

是的,基本上, @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<>();

在這種情況下,

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

將引用您的Plans實體planPKId的密鑰,並且

inverseJoinColumns = @JoinColumn(name = "id")

將引用Meds實體的密鑰id 由於weekday @JoinColumn(name = "weekday", referencedColumnName = "weekday") ,它沒有引用任何鍵,它不應該在這里。


如果您需要在連接表中添加更多字段,請手動創建自己的連接表並改用@ManyToOne: manytomany

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM