2012-02-07 126 views
1

基本休眠問題。休眠一對多關係與關係上的屬性

我有一個叫做Song的類和一個叫Artwork的類,兩者都是獨立存在的。然後一個Song的實例可以包含多個Artwork,當他們做的時候,這個關係的屬性是特定的,所以我創建了另一個類,名爲CoverArt,這兩個類之間的鏈接。我使用註釋來解決冬眠的問題。

如果我在構建數據庫時將所有三個類註釋爲@Entity,則會收到錯誤>'org.hibernate.MappingException:無法確定類型:圖形,表格:CoverArt,列:[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

CoverArt類應該是一個實體。

SongCoverArt實例的列表,你應該這樣有

@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它是哪一個。如果你不告訴它,它認爲它是一個簡單的列,這是錯誤的。

+0

Thankyou在Song中添加OneToMany和在Artwork中添加OneToOne已經完成了技巧,我不需要使用JoinColumn。但是,爲什麼CoverArt必須是一個只存在於歌曲背景下的實體,是因爲它是鏈接到一個實體? – 2012-02-07 15:34:28

+0

您可以將其設爲嵌入式對象,但這隻會使其變得更加困難,並且您無法像使用實體一樣查詢它們。當一些東西必須映射到它自己的表格時,我通常更喜歡使用一個實體。 – 2012-02-07 17:20:19

+0

並讓我的代碼使用這個工作我需要做@OneToMany(fetch = FetchType.EAGER)希望不會隱藏我的代碼中的問題。 – 2012-02-07 17:31:56

0

首先您應該告訴我們您希望在數據庫中看起來如何。 我想,你希望這樣的事情:

表「歌曲」 表「藝術品」 表「cover_arts」與fkeys:song_id和artwork_id

那麼一首歌「有很多個」 CoverArts每個封面作品「已一件「藝術品。

如果這是正確的,那麼:

  • 標註封面作品爲@Entity,而不是@Embeddable
  • 與@ManyToOne
  • 現場「封面藝術取代@ElementCollection封面作品類註釋字段 '作品' 內'在@OneToMany的Song類中。將字段'coverArt'重命名爲'coverArts'會很好,因爲它是一個集合,而不是單個實例。
+0

Thankyou聽起來像其他海報正確,雖然有趣的是你說使用ManyToOne而不是OneToOne – 2012-02-07 15:40:30