Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance JPA多态关系,静态和动态类型_Inheritance_Jpa_Orm_Polymorphism_Eclipselink - Fatal编程技术网

Inheritance JPA多态关系,静态和动态类型

Inheritance JPA多态关系,静态和动态类型,inheritance,jpa,orm,polymorphism,eclipselink,Inheritance,Jpa,Orm,Polymorphism,Eclipselink,我试图在JPA中实现一个相当复杂的映射。我需要类似于这个例子的东西。有好几种作家和好几种作品。 每一篇文章都需要有一个持久的author字段。作者的动态类型并不重要。这就是我将其设置为静态抽象类型的原因。 然而,作者应携带两份清单,具体说明各自所写的小说和诗歌 我得到的错误是,我不能使用MappedSuperClass作为持久化字段的目标。有人知道如何完成我想要完成的事情吗 我也希望作者拥有这种双向关系。因此,应在小说或诗歌方面绘制地图。然而,似乎“映射者”只能位于“一方…”。。。。一件东西拥有

我试图在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。非常感谢。