2016-11-22 63 views
0

我有一个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类是引发此错误这是很无奈。

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

回答

0

发现问题。 在LibraryItemModel类中,我使用LibraryItemAttribute定义了Join表,将其命名为“LIBRARY_ITEM_ATTRIBUTE”,它是库项目属性表的名称。

连接表是不同的表,应该有不同的表名。

对于上面的图库图像表,图像表称为library_image,而连接表称为LIBRARY_ITEM_IMAGE

相关问题