使用多态或不是hibernate映射到单表

时间:2017-09-15 13:54:27

标签: java hibernate oop design-patterns

我创建了简单的设计以便于解释,这里是UML:

enter image description here

这是附件类代码:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("Attachment")
@Table(name = "ATTACHMENTS")
public class Attachment {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="ID")
    private long id;

    @ManyToOne
    @JoinColumn(name = "USER_ID")
    private User user;
...
}

和BookAttachment类:

@Entity
@DiscriminatorValue("BookAttachment")
public class BookAttachment extends Attachment{

    @ManyToOne
    @JoinColumn(name="Book_ID")
    private Book book;
    ...
    }

我的问题是,如何在Book类中进行双向关系?应该这样做吗? (这不是多态性,也不确定它是否是好的设计)

public class Book{

    @OneToMany(mappedBy = "book", cascade = CascadeType.PERSIST)
    private List<BookAttachment> bookAttachments;
...
}

或以下: 我还不知道如何使用mappedBy,因为附件类与Book没有关系。

public class Book{

    @oneToMany
    private List<Attachment> bookAttachments;
...
}

这个例子中没有使用多态吗? Book类不应与userAttachment相关。 (这个例子只是为了清楚地理解设计将如何。它不是真实的,所以我需要理解,如果不使用多态,在这种情况下,设计是好还是坏)。

1 个答案:

答案 0 :(得分:0)

在我看来,没有正确的方法...... 同时你可以甚至在你的Book课程中实现两个选项,正确的一个取决于你的要求。

如果我必须选择一个,我会选择第二个,因为它更通用和模块化。

但是,当然,在你的第二个解决方案中,属性的名称是错误的!它应该是附件而不是bookAttachments。