尝试为数据库创建一些模型时,JPA出现问题。

我有这三个类(我将在此处放一部分代码):

GuideVersionLang

@Entity
public class GuideVersionLang implements LangItem {
     ...
     @ManyToOne
     @JoinColumns({
          @JoinColumn(name="GUIDE_VERSION_NUMBER", referencedColumnName="VERSION_NUMBER"),
          @JoinColumn(name="GUIDE_ID", referencedColumnName="GUIDE_ID")
     })
     @JsonIgnore
     private GuideVersion guideVersion;
     ...
}


GuideVersion

@Entity
@IdClass(value=GuideVersionKey.class)
public class GuideVersion {
     ...
     @OneToMany(mappedBy="guideVersion", orphanRemoval=true, cascade=CascadeType.PERSIST)
     private LangsCollection<GuideVersionLang> guideVersionLangs;

     @Id
     @ManyToOne
     @JoinColumn(nullable = false, name="GUIDE_ID")
     @JsonIgnore
     private Guides guide;

     @Id
     @Column(name = "VERSION_NUMBER")
     private long versionNumber;
     ...
}


和GuideVersionKey

@Embeddable
public class GuideVersionKey {
    private long versionNumber;
    private long guide;
    ...
}


因此,我有一个GuideVersion类,该类具有复合键。它的复合键由Guide的id和versionNumber组成,均为长数字。

如您在代码中所见,我只想在GuideVersionGuideVersionLang之间建立关系。但是,我在@JoinColumns批注上遇到问题:

@JoinColumns({
        @JoinColumn(name="GUIDE_VERSION_NUMBER", referencedColumnName="VERSION_NUMBER"),
        @JoinColumn(name="GUIDE_ID", referencedColumnName="GUIDE_ID")
})


我不知道为什么,但是@JoinColumns无法正常工作。我收到此错误:


  注释元素[field guideVersion]中的@JoinColumns来自
  实体类别[类别com.model.GuideVersionLang]不完整。
  当源实体类使用复合主键时,
  必须为每个连接列指定@JoinColumn
  @JoinColumns。名称和referencedColumnName元素都必须
  在每个这样的@JoinColumn中指定。


如您在代码中看到的,我在@JoinColumns批注内指定了两个@Id列。我在这里想念什么?

非常感谢你!

最佳答案

有关所讨论代码的一些技巧:

1.因为您有embeddedGuideVersion)的GuideVersionKey id,所以您实际上不需要为其指定ID(只需使用@EmbeddedId注释)。

2.您可以使用@MapsId映射Guid_id。

@Entity
public class GuideVersion {
     ...

     @EmbeddedId
     GuideVersionKey IdKey;

     @ManyToOne
     @MapsId("guide")
     @JoinColumn(name = "GUIDE_ID")
     private Guides guide;

     ...
}

10-08 18:54