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

时间:2012-01-07 21:09:27

标签: inheritance jpa orm polymorphism eclipselink

我正在尝试在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 {
}

1 个答案:

答案 0 :(得分:1)

抽象类应该使用@Entity注释,而不是@MappedSuperclass。当然,您应该选择inheritance策略。

关于拥有方:拥有一个关联没有任何语义含义。它只是意味着JPA使用关联的这一方来知道关联是否存在。 JPA确实要求多方拥有关联映射,这是合乎逻辑的,因为它位于与外键关联的许多方面相关联的表中。对你而言,这只意味着当一首诗被添加到作者时,这首诗应该引用它的作者,因为这将使这种关联持久。

此外,您不应该使用ArrayList,而是使用List。 EclipseLink将使用自己的List实现来支持延迟加载,级联等。而顺便说一下,编程接口而不是实现是一种很好的做法。