gpt4 book ai didi

java - Hibernate 一对多关系与关系上的属性

转载 作者:行者123 更新时间:2023-11-30 04:53:54 25 4
gpt4 key购买 nike

基本的 Hibernate 问题。

我有一个名为Song的类和一个名为Artwork的类,它们都是独立存在的。然后,Song 的实例可以包含多个 Artwork,当它们存在时,就会有特定于该关系的属性,因此我创建了另一个名为 CoverArt 的类两者之间的联系。我正在使用 hibernate 内容的注释并遇到问题。

如果我在构建数据库时将所有三个类注释为@Entity,则会收到错误>'org.hibernate.MappingException:无法确定类型:Artwork,at table:CoverArt,for列:[org.hibernate.mapping.Column(artwork)]'

如果我将 CoverArt 更改为 @Embeddable,因为它仅存在于 Song 的上下文中,我会收到错误

'org.hibernate.annotations.common.AssertionFailure: Declaring class is not found in the inheritance state hierarchy: com.jthink.songlayer.CoverArt'

我无法弄清楚这些消息在说什么,我有什么问题。这是三个类的相关代码

歌曲:

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

@ElementCollection(fetch=FetchType.EAGER)
@IndexColumn(name = "POSITION")
private List<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;
}
}

图稿:

@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;
}
}

最佳答案

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 它是哪一个。如果您不告诉它,它会假定它是一个简单的列,这是错误的。

关于java - Hibernate 一对多关系与关系上的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9178386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com