当 Hibernate 尝试为 Item 创建映射时,下一个异常抛出http://pastebin.com/RdysJeiU
异常的原因是列号和实际属性号不匹配。
接下来是数组的内容:
columnAliases = [IMAGE_TITLE]
propertyNames = [imageMetadata,title]
-
org.hibernate.persister.collection;
public abstract class AbstractCollectionPersister
private void initCollectionPropertyMap(String aliasName, Type type, String[] columnAliases, String[] columnNames) {
collectionPropertyColumnAliases.put( aliasName, columnAliases );
collectionPropertyColumnNames.put( aliasName, columnNames );
if ( type.isComponentType() ) {
CompositeType ct = (CompositeType) type;
String[] propertyNames = ct.getPropertyNames();
for ( int i = 0; i < propertyNames.length; i++ ) {
String name = propertyNames[i];
collectionPropertyColumnAliases.put( aliasName + "." + name, columnAliases[i] );
collectionPropertyColumnNames.put( aliasName + "." + name, columnNames[i] );
}
}
}
Photo 实体的映射完整无误。
为什么Hibernate不能映射Item实体的@Embeddable集合属性的@Embeddable Image类的imageMetadata属性?
包model.dao.mappings;导入 javax.persistence.*;
@MappedSuperclass
public class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
protected long id;
public BaseEntity() {}
public long getId() {
return id;
}
}
package model.dao.mappings.collections.embedable;
import model.dao.mappings.BaseEntity;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public class Item extends BaseEntity {
@Column(name = "ITEM_NAME")
private String name;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "ITEM_IMAGE", joinColumns = @JoinColumn(name = "ITEM_ID"))
private List<Image> images = new ArrayList<Image>();
private Item() {}
public Item(String name, List<Image> images) {
this.name = name;
this.images = images;
}
public List<Image> getImages() {
return images;
}
public void setImages(List<Image> images) {
this.images = images;
}
}
package model.dao.mappings.collections.embedable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@Embeddable
public class Image {
@Column(name = "IMAGE_TITLE")
private String title;
private ImageMetadata imageMetadata;
private Image() {}
public Image(String title, ImageMetadata imageMetadata) {
this.title = title;
this.imageMetadata = imageMetadata;
}
}
package model.dao.mappings.collections.embedable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
@Embeddable
public class ImageMetadata {
@Column(name = "SIZE_X")
private int sizeX;
@Column(name = "SIZE_Y")
private int sizeY;
private ImageMetadata() {}
public ImageMetadata(int sizeX, int sizeY) {
this.sizeX = sizeX;
this.sizeY = sizeY;
}
}
package model.dao.mappings.collections.embedable;
import model.dao.mappings.BaseEntity;
import javax.persistence.*;
import java.util.List;
@Entity
public class Photo extends BaseEntity {
private String title;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "PHOTO_METADATA", joinColumns = @JoinColumn(name = "PHOTO_ID"))
private List<ImageMetadata> metadataList;
private Photo() {}
public Photo(String title, List<ImageMetadata> metadataList) {
this.title = title;
this.metadataList = metadataList;
}
}