Inheritance JPA多态关系,静态和动态类型
我试图在JPA中实现一个相当复杂的映射。我需要类似于这个例子的东西。有好几种作家和好几种作品。 每一篇文章都需要有一个持久的author字段。作者的动态类型并不重要。这就是我将其设置为静态抽象类型的原因。 然而,作者应携带两份清单,具体说明各自所写的小说和诗歌 我得到的错误是,我不能使用MappedSuperClass作为持久化字段的目标。有人知道如何完成我想要完成的事情吗 我也希望作者拥有这种双向关系。因此,应在小说或诗歌方面绘制地图。然而,似乎“映射者”只能位于“一方…”。。。。一件东西拥有许多东西,这似乎并不奇怪。。。为什么我不能这样做 非常感谢你的帮助Inheritance JPA多态关系,静态和动态类型,inheritance,jpa,orm,polymorphism,eclipselink,Inheritance,Jpa,Orm,Polymorphism,Eclipselink,我试图在JPA中实现一个相当复杂的映射。我需要类似于这个例子的东西。有好几种作家和好几种作品。 每一篇文章都需要有一个持久的author字段。作者的动态类型并不重要。这就是我将其设置为静态抽象类型的原因。 然而,作者应携带两份清单,具体说明各自所写的小说和诗歌 我得到的错误是,我不能使用MappedSuperClass作为持久化字段的目标。有人知道如何完成我想要完成的事情吗 我也希望作者拥有这种双向关系。因此,应在小说或诗歌方面绘制地图。然而,似乎“映射者”只能位于“一方…”。。。。一件东西拥有
@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 {
}
@MappedSuperclass
@访问权限(AccessType.PROPERTY)
公共抽象类AbstractWriter实现了可序列化{
私人长id;
私有字符串名称;
私人字符串电子邮件;
私人小说;
私人阿雷亚主义诗歌;
@OneToMany(mappedBy=“作者”)
公共阵列列表{
回归小说;
}
公共小说(ArrayList小说){
这就是小说;
}
@OneToMany(mappedBy=“作者”)
公共ArrayList getPoems(){
回归诗;
}
公共诗歌(ArrayList诗歌){
这就是诗歌;
}
@列(nullable=false)
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
@Id@GeneratedValue(策略=GenerationType.AUTO)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
}
@实体
公共类ProfessionalWriter扩展AbstractWriter{
}
@实体
公共类StudentWriter扩展AbstractWriter{
}
@映射超类
公共抽象类AbstractWriting实现了可序列化{
私人长id;
私有字符串标题;
私人摘要作者;
专用字节[]字;
@许多酮
公共摘要作者getAuthor(){
返回作者;
}
public void setAuthor(AbstractWriter author){
this.author=作者;
}
@Id@GeneratedValue(策略=GenerationType.AUTO)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
@高球
公共字节[]getWords(){
返回单词;
}
公共无效设置字(字节[]字){
这个单词=单词;
}
@列(nullable=false)
公共字符串getTitle(){
返回标题;
}
公共无效集合标题(字符串标题){
this.title=标题;
}
}
@实体
公共类小说是抽象写作的延伸{
}
@实体
公共课诗歌是抽象写作的延伸{
}
抽象类应该用@Entity注释,而不是@MappedSuperclass注释。当然,你应该选择一种策略
关于拥有方:拥有关联没有任何语义意义。这只是意味着JPA使用关联的这一面来了解关联是否存在。JPA确实要求多方拥有关联映射,这是合乎逻辑的,因为它位于与外键所在的多方关联的表中。对你来说,这只是意味着当一首诗被添加到一个作者身上时,这首诗应该引用它的作者,因为这将使这种联系持续下去
此外,不应使用ArrayList,而应使用List。EclipseLink将使用自己的列表实现来支持延迟加载、级联等。顺便说一句,编程到接口而不是实现是一种很好的做法。谢谢您的回答。我会做出这些改变。你能建议我如何编程到接口而不是实现吗。我想我不太明白你的意思。这意味着最好总是使用接口类型(例如List、Map)而不是具体类型(例如ArrayList、HashMap)。这样,如果您改变主意,想要使用LinkedList(或TreeMap)而不是ArrayList,您只需在一个地方更改代码:列表的实例化。代码的其余部分不应该关心它是ArrayList还是LinkedList。它需要知道的只是它是一个列表。在JPA中,这是非常重要的,因为EclipseLink将有效地用EclipseLinkLazyList之类的东西替换您的列表,它实现了list.very insightful。非常感谢。