我正在尝试在JPA中实现一个相当复杂的映射。我需要类似于这个例子的东西。有几种作家和几种作品。 每篇文章都需要有一个可持久的作者字段。作者的动态类型无关紧要。这就是我将它设置为静态抽象类型的原因。 然而,authro应该带有两个列表,指定每个人写的小说和诗歌。
我收到错误,说我不能使用MappedSuperClass作为可持久字段的目标。有谁知道如何完成我想要完成的任务?
我也希望作者拥有这种双向关系。如此映射应该在小说或诗歌方面。然而,看起来映射只能在OneToMany方面......看起来似乎并不是一个奇怪的情况,其中一件东西拥有很多东西......为什么我不能这样做......
非常感谢帮助
@MappedSuperclass
@Access(AccessType.PROPERTY)
public abstract class AbstractWriter implements Serializable{
private Long id;
private String name;
private String email;
private ArrayList<Novel> novels;
private ArrayList<Poem> poems;
@OneToMany(mappedBy="author")
public ArrayList<Novel> getNovels() {
return novels;
}
public void setNovels(ArrayList<Novel> novels) {
this.novels = novels;
}
@OneToMany(mappedBy="author")
public ArrayList<Poems> getPoems() {
return poems;
}
public void setPoems(ArrayList<Poem> poems) {
this.poems = poems;
}
@Column(nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Id @GeneratedValue(strategy= GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
@Entity
public class ProfessionalWriter extends AbstractWriter {
}
@Entity
public class StudentWriter extends AbstractWriter {
}
@MappedSuperclass
public abstract class AbstractWriting implements Serializable{
private Long id;
private String title;
private AbstractWriter author;
private byte[] words;
@ManyToOne
public AbstractWriter getAuthor() {
return author;
}
public void setAuthor(AbstractWriter author) {
this.author = author;
}
@Id @GeneratedValue(strategy= GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Lob
public byte[] getWords() {
return words;
}
public void setWords(byte[] words) {
this.words = words;
}
@Column(nullable=false)
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
@Entity
public class Novel extends AbstractWriting {
}
@Entity
public class Poem extends AbstractWriting {
}
答案 0 :(得分:1)
抽象类应该使用@Entity注释,而不是@MappedSuperclass。当然,您应该选择inheritance策略。
关于拥有方:拥有一个关联没有任何语义含义。它只是意味着JPA使用关联的这一方来知道关联是否存在。 JPA确实要求多方拥有关联映射,这是合乎逻辑的,因为它位于与外键关联的许多方面相关联的表中。对你而言,这只意味着当一首诗被添加到作者时,这首诗应该引用它的作者,因为这将使这种关联持久。
此外,您不应该使用ArrayList,而是使用List。 EclipseLink将使用自己的List实现来支持延迟加载,级联等。而顺便说一下,编程接口而不是实现是一种很好的做法。