Hibernate与关系属性的一对多关系

时间:2012-02-07 14:53:16

标签: java hibernate entity-relationship

基本的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;
    }
}

2 个答案:

答案 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“都有一个”艺术作品。

如果这是正确的,那么:

  • 使用@Entity而不是@Embeddable
  • 注释CoverArt
  • 在CoverArt类中使用@ManyToOne
  • 注释字段'artwork'
  • 使用@OneToMany替换Song类中的字段'coverArt'上的@ElementCollection。将字段'coverArt'重命名为'coverArts'会很好,因为它是一个集合,而不是单个实例。
相关问题