[英]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.