【问题标题】:JPA - Mapping a column with same entityJPA - 映射具有相同实体的列
【发布时间】:2019-12-29 20:22:15
【问题描述】:

在 JPA 实体中,我想映射具有相同类型实体的列。查看以下实体。

@Entity
@Table(name = "Score")
public class Score {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Long id;

    @Column(name = "question")
    private String question;

    @Column(name = "score_count")
    private String scoreCount;

    @Column(name = "comment")
    private String comment;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private Score parent;

    //Getter setter goes here
}

我添加了Scope 实体的父关系。

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private Score parent;

如果我这样做,Java 不会抛出任何异常。但是我想知道,这样做在设计感上有什么问题吗?这是不好的做法还是好的做法?如果为同一行设置了父级,即父级表示同一行,那么它会是一个循环吗?

我现在正在设计一些实体,所以很高兴知道这样做与否的原因。谢谢!

注意:我使用的是spring data jpa、hibernate和mysql作为数据库

【问题讨论】:

  • 每个关联都应该有一个结束意味着一个父节点不能是它自己的父节点。如果一个节点没有父节点,您需要将其父节点设置为null,否则您会遇到您提到的问题.
  • https://stackoverflow.com/a/3393662/3479154

标签: java hibernate jpa spring-data-jpa


【解决方案1】:

没问题。这种自引用关系很常见,尤其是在处理分层数据时。

在 OOP 思维方式中,我们希望专注于抽象而非细节,因为它易于理解。因此,如果父实体和子实体实际上是相同的抽象,并且在本质上具有一些共同的行为,那么如果正确应用此模式甚至是一个很好的寄生虫。将父级和子级建模为同一类型允许我们在对它们编写逻辑时将它们视为相同的抽象。

如果为同一行设置了父级,即父级表示同一行,则 会是循环吗?

是的。它会形成一个循环。这就是为什么在为孩子设置父母时,您应该检查父母不能是孩子本身,这应该被视为应该在代码中强制执行的业务要求之一。

【讨论】:

    猜你喜欢
    • 2019-02-13
    • 2017-08-02
    • 2011-07-13
    • 2020-10-26
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多