基本的Hibernate问题。
我有一个名为Song
的类和一个名为Artwork
的类,它们都是独立存在的。然后Song
的一个实例可以包含多个Artwork
s,当它们执行时,该属性具有特定属性,因此我创建了另一个名为CoverArt
的类,它们在两者之间进行链接。我正在为hibernate的东西使用注释并遇到问题。
如果我在构建数据库时将所有三个类注释为@Entity
,我会收到错误>'org.hibernate.MappingException:无法确定类型:Artwork,at table:CoverArt,for columns:[ org.hibernate.mapping.Column(插图)]'
如果我将CoverArt
更改为@Embeddable
,因为它只存在于Song
的上下文中,我会收到错误
'org.hibernate.annotations.common.AssertionFailure:在继承状态层次结构中找不到声明类:com.jthink.songlayer.CoverArt'
我无法弄清楚这些消息在说什么,我有什么不对。以下是三个类的相关代码
Song
:
@Entity
public class Song
{
@Id
@GeneratedValue
private Integer recNo;
@ElementCollection(fetch=FetchType.EAGER)
@IndexColumn(name = "POSITION")
private List<CoverArt> coverArt;
.....
CoverArt
:
@Embeddable
public class CoverArt
{
private String imageType;
private String description;
private Artwork artwork;
@Id
@GeneratedValue
private Integer id;
public CoverArt()
{
}
public String getImageType()
{
return imageType;
}
public void setImageType(String imageType)
{
this.imageType = imageType;
}
public String getDescription()
{
return description;
}
public void setDescription(String description)
{
this.description = description;
}
public Artwork getArtwork()
{
return artwork;
}
public void setArtwork(Artwork artwork)
{
this.artwork = artwork;
}
}
Artwork
:
@Entity
public class Artwork
{
public Artwork()
{
}
public Artwork(byte[] imageData)
{
this.imageData=imageData;
}
@Id
@GeneratedValue
private Integer id;
@Lob
private byte[] imageData;
private String mimeType;
private int width;
private int height;
public byte[] getImageData()
{
return imageData;
}
public void setImageData(byte[] imageData)
{
this.imageData = imageData;
}
public String getMimeType()
{
return mimeType;
}
public void setMimeType(String mimeType)
{
this.mimeType = mimeType;
}
public int getWidth()
{
return width;
}
public void setWidth(int width)
{
this.width = width;
}
public int getHeight()
{
return height;
}
public void setHeight(int height)
{
this.height = height;
}
}
答案 0 :(得分:2)
CoverArt
类应该是一个实体。
Song
有一个CoverArt
个实例列表,您应该
@OneToMany
@JoinColumn(...)
private List<CoverArt> coverArts; // note the final s, since it's plural
每个CoverArt
链接到Artwork
,因此您还应该有关联。目前尚不清楚它是ManyToOne还是OneToOne,很难。我猜它是OneToOne:
@OneToOne
@JoinColumn(...)
private Artwork artwork;
这很简单。每次实体具有对另一个实体的引用或另一个实体实例的集合时,您都有一个共同点。协会可以是OneToMany,OneToOne,ManyToOne或ManyToMany。你必须告诉Hibernate它是哪一个。如果你不告诉它,它会认为这是一个错误的简单列。
答案 1 :(得分:0)
首先,您应该告诉我们您希望在数据库中看起来如何。 我想你想要这样的东西:
表'歌' 表'艺术品' 表'cover_arts'与fkeys:song_id和artwork_id
所以一首歌“有很多”CoverArts,每个CoverArt“都有一个”艺术作品。
如果这是正确的,那么: