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