2012-02-07 13 views
1

基本的な休止状態の質問。関係の属性とHibernate 1対多の関係

私はSongというクラスとArtworkというクラスを持っていますが、どちらも独立して存在します。 Songのインスタンスには複数のが含まれていて、それらの属性がその関係に特有のものであるため、CoverArtという2つのクラスをリンクする別のクラスを作成しました。私は休止状態のものと問題があるために注釈を使用しています。

データベースを構築するときに、3つのクラスすべてに@Entityと注釈を付けると、エラーが発生します。> 'org.hibernate.MappingException:型の判別ができません:アートワーク、テーブル:CoverArt、列:[org.hibernate。 mapping.Column(アートワーク)] org.hibernate.annotations.common.AssertionFailure「

それだけSongの文脈に存在するように私は、@EmbeddableCoverArtを変更すると、私はエラー

を取得します」宣言クラスが継承状態階層に見つかりません:com.jthink.songlayer.CoverArt '

私はこれらのメッセージが何を言っているのか、私は間違っているのか分かりません。

@Entity 
public class Song 
{ 
    @Id 
    @GeneratedValue 
    private Integer recNo; 

    @ElementCollection(fetch=FetchType.EAGER) 
    @IndexColumn(name = "POSITION") 
    private List<CoverArt> coverArt; 

..... 

CoverArt:ここでは三つのクラス

Songから関連するコードがある

@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インスタンスのリストを持っている、あなたは、このようにArtwork

@OneToMany 
@JoinColumn(...) 
private List<CoverArt> coverArts; // note the final s, since it's plural 

CoverArtリンクを持っている必要がありますので、あなたにも関連を持っている必要があります。それがManyToOneかOneToOne、厳しいかどうかは明らかではありません。私はそれがOneToOneだと仮定します:

@OneToOne 
@JoinColumn(...) 
private Artwork artwork; 

かなり簡単です。エンティティが別のエンティティへの参照、または別のエンティティインスタンスのコレクションを持つたびに、あなたはアソシエーションを持っています。アソシエーションは、OneToMany、OneToOne、ManyToOneまたはManyToManyです。 Hibernateにはそれがどれであるかを伝える必要があります。あなたがそれを言わなければ、間違っている単純な列だとみなします。

+0

SongのOneToManyとアートワークのOneToOneを追加していただきありがとうございます。私はJoinColumnを使用する必要はありませんでした。しかし、CoverArtはなぜそれが歌の文脈にのみ存在するentiyでなければならないのですか?それはエンティティにリンクしているからですか? –

+0

これを埋め込みオブジェクトにすることはできますが、難しくなるだけで、エンティティと同様にクエリを実行することはできません。私は通常、何かを独自のテーブルにマップする必要があるときにエンティティを使用する方が好きです。 –

+0

これを使用して私のコードを取得するには、@OneToMany(fetch = FetchType.EAGER)のコードで問題が隠れていないことが必要でした。 –

0

まず、データベース内のすべてのものをどのように見せるかを教えてください。 「だから歌がCoverArts「多くを持っている」とそれぞれCoverArtたsong_idと

をartwork_id:FKEYSと

テーブル「歌」 テーブル「作品」 テーブル「cover_arts」: 私はあなたがそのような何かをしたいと仮定します1つの "アートワーク。

これはその後、正しい場合:

@ManyToOne
  • coverArt」フィールド上@ElementCollectionを置き換えるとCoverArtクラスの注釈フィールド 'アートワーク' の内部@Entity代わりに@Embeddable
    • 注釈CoverArt @OneToManyでSongクラスの中で。単一のインスタンスではなく、フィールド 'coverArt'の名前を 'coverArts'に変更するといいでしょう。
  • +0

    ThankToはOneToOneの代わりにManyToOneを使用すると面白いが、他のポスターのように正確に聞こえる –