繁体   English   中英

外键必须具有与引用的主键相同的列数。 但是我没有使用复合键

[英]Foreign key must have same number of columns as the referenced primary key. But I'm not using a composite key

我有一个LibraryModel类,一个LibraryImage类和一个LibraryAttribute类。 LibraryModel可以具有任意数量的LibraryImages和LibraryAttributes。

我得到的错误:

org.hibernate.MappingException: Foreign key (FKmbn4xh7xdxv371ao5verqueu3:library_item_attribute [LIBRARY_ITEM_ATTRIBUTE_ID])) must have same number of columns as the referenced primary key (library_item_attribute [LIBRARY_ITEM_ID,LIBRARY_ITEM_ATTRIBUTE_ID])

这是我带注释的对象:

库模型:

@Entity
@Table(name = "library_item", uniqueConstraints = {

})
@Inheritance(strategy = InheritanceType.JOINED)
public class LibraryItemModel implements LibraryItem{
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "LIBRARY_ITEM_ID", unique = true, nullable = false)
    private Integer libraryItemId;

    @Column(name = "ITEM_TITLE", unique = false, nullable = false)
    private String itemTitle;

    @Column(name = "IS_PARENT", nullable = false)
    private Boolean isParent;

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name="LIBRARY_ID", nullable = false)
    private LibraryModel libraryModel;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "ITEM_LISTING",
            joinColumns = {@JoinColumn(name = "PARENT_LIB_ITEM_ID", nullable=false)},
            inverseJoinColumns = {@JoinColumn(name="CHILD_LIB_ITEM_ID", nullable = false)})
    private Set<LibraryItemModel> itemChildren = new HashSet<>();

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "itemChildren")
    private Set<LibraryItemModel> itemParents = new HashSet<>();

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "LIBRARY_ITEM_IMAGE",
            joinColumns = { @JoinColumn(name = "LIBRARY_ITEM_ID", nullable=false)},
            inverseJoinColumns = { @JoinColumn(name="LIBRARY_IMAGE_ID", nullable = false)})
    private Set<LibraryImage> itemImages = new HashSet<>();

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "rootLibraryItemModel")
    private Set<LibraryModel> libraries = new HashSet<>();

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "LIBRARY_ITEM_ATTRIBUTE",
            joinColumns = { @JoinColumn(name = "LIBRARY_ITEM_ID", nullable =false)},
            inverseJoinColumns = { @JoinColumn(name="LIBRARY_ITEM_ATTRIBUTE_ID", nullable = false)})
    private Set<LibraryItemAttribute> libraryItemAttributes = new HashSet<>();
}

LibraryImage:

@Entity
@Table(name = "library_image", uniqueConstraints = {

})
public class LibraryImage {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "LIBRARY_IMAGE_ID", unique = true, nullable = false)
    private Integer libraryImageId;

    @Column(name = "IMAGE_LOCATION")
    private String imageLocation;

    @Column(name = "IMAGE_TITLE")
    private String imageTitle;

    @Enumerated(EnumType.STRING)
    private LibraryImageType imageType;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name="LIBRARY_ITEM_ID", nullable = false)
    private LibraryItemModel libraryItemModel;
    }

库属性:

@Entity
@Table(name = "library_item_attribute", uniqueConstraints = {

})
public class LibraryItemAttribute {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "LIBRARY_ITEM_ATTRIBUTE_ID", unique = true, nullable = false)
    private Integer libraryItemAttributeId;

    @Column(name = "ATTRIBUTE_NAME")
    private String attributeName;

    @Column(name = "ATTRIBUTE_VALUE")
    private String attributeValue;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name="LIBRARY_ITEM_ID", nullable = false)
    private LibraryItemModel libraryItemModel;
}

这确实令人沮丧,因为LibraryImage类的映射没有问题并且不会引发任何错误,但是以与LibraryImage类相同的方式注释的LibraryAttribute类引发了此错误。

有人可以看看一下,让我知道我的问题是什么吗?

找到了问题。 在LibraryItemModel类中,我将带有LibraryItemAttribute的Join表定义为“ LIBRARY_ITEM_ATTRIBUTE”,这是Library项属性表的名称。

联接表是一个不同的表,并且应该具有一个不同的表名。

对于上面的库映像表,映像表称为library_image,而联接表称为LIBRARY_ITEM_IMAGE

暂无
暂无

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

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