Hibernate От одного ко многим отношения с атрибутами на отношения - PullRequest
1 голос
/ 07 февраля 2012

Основной вопрос Hibernate.

У меня есть класс с именем Song и класс с именем Artwork, оба существуют независимо.Тогда экземпляр Song может содержать несколько Artwork с, и когда они это делают, существуют атрибуты, специфичные для этого отношения, поэтому я создал другой класс с именем CoverArt, который связывает эти два.Я использую аннотации для спящего материала и у меня возникают проблемы.

Если при создании базы данных я аннотирую все три класса как @Entity, я получаю ошибку> 'org.hibernate.MappingException: Не удается определить типfor: Artwork, в таблице: CoverArt, для столбцов: [org.hibernate.mapping.Column (artwork)] '

Если я изменю CoverArt на @Embeddable, так как он существует только в контекстеa 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 ]

2 голосов
/ 07 февраля 2012

Класс 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, какой это.Если вы этого не скажете, предполагается, что это простой столбец, который является неправильным.

0 голосов
/ 07 февраля 2012

Прежде всего, Вы должны сказать нам, как Вы хотите, чтобы все это выглядело в базе данных.Я предполагаю, что вы хотите что-то вроде этого:

таблица 'песен' таблица 'художественных работ' таблица 'cover_arts' с fkeys: song_id и artwork_id

Таким образом, у песни "есть много" CoverArts и каждый CoverArt "имеет одно "Artwork.

Если это правильно, то:

  • Аннотируйте CoverArt с @Entity вместо @ Embeddable
  • внутри класса CoverArt аннотируйте поле 'artwork'с @ ManyToOne
  • замените @ElementCollection в поле 'coverArt' внутри класса Song на @OneToMany.Было бы неплохо переименовать поле 'coverArt' в 'coverArts', поскольку оно является коллекцией, а не одним экземпляром.
...